请教一下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 |
|