分享

请教一下16*64点阵屏的程序问题 - 『 单片机论坛 』 - Tony嵌入式论坛 Ton...

 昵称4167244 2010-10-26
请教一下16*64点阵屏的程序问题
这个16*64的点阵屏程序怎么没有延时程序,怎么还能正常运行?
电路是16*64双色点阵屏行驱动138、列扫描595,08接口
//--------------------------------
//名称:C语言实现汉字显示(12c4052)
//作者:wanchun311
//日期:2008年12月15日
//--------------------------------
#include "reg51.h"
#define  uchar unsigned char
#define  uint  unsigned int
void Keyscan (void); //修改参数按键扫描子程序
void  Sendping(); //发送半屏子程序
sbit  CP =P0^0 ;    //74HC595移时钟
sbit  SCK =P0^1 ;   // 74HC595锁存信号
sbit  Red=P0^2 ;   //红色数据输出引脚低电平有效    
sbit  Greed=P0^3;  // 绿色数据输出引脚低电平有效   
sbit  Gen1=P2^6 ;  //全屏控制使能1,高电平有效
sbit  D = P0^7 ;   //行扫描地址D(地址第四引脚) 
sbit  colorkey = P2^0;//颜色修改按键
sbit  changkey = P2^1; //显示内容修改按键
uchar SendData;    //要发送的数据变量
uchar shuzu1;     //数组一维变量
uchar shuzu2;   //数组二维变量
uchar chang;   //改变显示能容(0为欢迎光临;1为停止营业 )     
uchar color;   //外部参数改变颜色设置(0为红色;1为绿色,2为黄色)
uchar hang;   //行扫描变量  (半屏只有16行,所以hang=0到15)   
uchar code data1[8][32]=
     {
      { 0x00,0x80,0x00,0x80,0xFC,0x80,0x04,0xFC,
      0x45,0x04,0x46,0x48,0x28,0x40,0x28,0x40,
      0x10,0x40,0x28,0x40,0x24,0xA0,0x44,0xA0,
      0x81,0x10,0x01,0x08,0x02,0x0E,0x0C,0x04 },//欢  
     
      {  0x00,0x00,0x41,0x84,0x26,0x7E,0x14,0x44,
      0x04,0x44,0x04,0x44,0xF4,0x44,0x14,0xC4,
      0x15,0x44,0x16,0x54,0x14,0x48,0x10,0x40,
      0x10,0x40,0x28,0x46,0x47,0xFC,0x00,0x00 },//迎
     
      {  0x01,0x00,0x21,0x08,0x11,0x0C,0x09,0x10,
      0x09,0x20,0x01,0x04,0xFF,0xFE,0x04,0x40,
      0x04,0x40,0x04,0x40,0x04,0x40,0x08,0x40,
      0x08,0x42,0x10,0x42,0x20,0x3E,0x40,0x00 },// 光
     
      {  0x10,0x80,0x10,0x80,0x51,0x04,0x51,0xFE,
      0x52,0x00,0x54,0x80,0x58,0x60,0x50,0x24,
      0x57,0xFE,0x54,0x44,0x54,0x44,0x54,0x44,
      0x54,0x44,0x14,0x44,0x17,0xFC,0x14,0x04},//  临
    
     { 0x10,0x80,0x10,0x48,0x17,0xFC,0x20,0x00,
      0x23,0xF8,0x62,0x08,0xA3,0xF8,0x20,0x00,
      0x2F,0xFE,0x28,0x02,0x33,0xF4,0x20,0x40,
      0x20,0x40,0x20,0x40,0x21,0x40,0x20,0x80},//停  
    
     {   0x01,0x00,0x01,0x00,0x01,0x00,0x11,0x00,
      0x11,0x00,0x11,0x10,0x11,0xF8,0x11,0x00,
      0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,
      0x11,0x00,0x11,0x04,0xFF,0xFE,0x00,0x00},//止  
     
      {  0x04,0x40,0x04,0x48,0x7F,0xFC,0x04,0x40,
      0x7F,0xFE,0x40,0x02,0x8F,0xE4,0x08,0x20,
      0x08,0x20,0x0F,0xE0,0x00,0x00,0x1F,0xF0,
      0x10,0x10,0x10,0x10,0x1F,0xF0,0x10,0x10},// 营  
     
      {  0x04,0x40,0x04,0x40,0x04,0x40,0x04,0x40,
      0x44,0x44,0x24,0x44,0x24,0x48,0x14,0x48,
      0x14,0x50,0x14,0x50,0x14,0x60,0x04,0x40,
      0x04,0x40,0x04,0x44,0xFF,0xFE,0x00,0x00},// 业 
    
     };
void Keyscan(void)
{
   if(colorkey ==0)  //判断修改颜色建是否被按下
   {
    Sendping();
  if(colorkey ==0)
  {
   color++;
   if(color>2) {color = 0;}
  }
   }
    if(changkey ==0)  //判断修改颜色建是否被按下
   {
    Sendping();
  if(changkey ==0)
  {
   shuzu1++;
   if(shuzu1>1) {shuzu1= 0;}
  }
   }
}
//------------------------------------
//----------字发送子程序-----------
void SendByte(void)
  {
     uchar m;
     for(m=0;m<8;m++)
     {
       CP = 0;
    if(color==0)  {Red = !(SendData & 0x80);}    //红屏显示
    else if  (color==1) {Greed = !(SendData & 0x80);}   //绿屏显示
    else if (color==2) {Red = !(SendData & 0x80);Greed= !(SendData & 0x80); }  //黄屏显示
    else; 
    SendData =SendData<<1;  
    CP = 1;   //移位时钟上升沿
     }
  }
    //-----------------------------------
    //----------行扫描子程序-------------
    void RowsCan(void)
    { uchar scan1;
       if (hang==0x08)
   {
    D = ! D;hang =0x00;
   }
   scan1 =hang;
   scan1 =scan1<<5;
   P0 = P0 & 0x1f;
   P0 = P0 | scan1;
   hang++;
  }
  
  void SendHang(void)
  {
     uchar m2,shuzu;
   shuzu = shuzu1*4; //一维数组变量参数传给数组变量
   for(m2 =0;m2<2;m2++)
   {
    SendData = data1[shuzu][shuzu2+m2];
    SendByte();
   }
   shuzu++;
   
   for(m2 =0;m2<2;m2++)
   {
    SendData = data1[shuzu][shuzu2+m2];
    SendByte();
   }
   shuzu++;
  
   for(m2 =0;m2<2;m2++)
   {
    SendData = data1[shuzu][shuzu2+m2];
    SendByte();
   }
   shuzu++;
  
   for(m2 =0;m2<2;m2++)
   {
    SendData = data1[shuzu][shuzu2+m2];
    SendByte();
   }
   SCK = 0;
   SCK = 1;   //上升沿数据锁存
    RowsCan();  //行扫描
  }
     //---------------------------------------
  //----------发送一屏数据-----------------
  void Sendping(void)
  {
    SendHang();
   shuzu2++ ;
   shuzu2++ ;
   if(shuzu2 ==32) { shuzu2 =0;}  
  }
  void initial(void)
     {
     Gen1 = 1;
   D = 0;
   Red = 1;
   Greed =1;
   SendData = 0x00;
   hang = 0x00;
   shuzu1 = 0x00;
   shuzu2 = 0x00;
   color = 0;
   chang = 0;   
   }
  //;---------------------------------
  //;---------主程序循环--------------
     void main()
  {
   
  
   initial();
   while(1)
   { Keyscan();
      Sendping();
   }
   }
转自Tony嵌入式论坛,地址:http://www./bbs/thread-25444-1-1.html

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多