xing1234 发表于 2014-11-12 18:02 厉害啊,欣赏欣赏。谢谢 |
楼主的思路好啊。通过调整,把板子搞好了,值得借鉴。向楼主学习。 |
xing1234 发表于 2014-11-13 08:24 非常感谢你,经过实验,原来是板子上的74hc123工作不正常引起的,可能是我的程序达不到原来板子的刷新频率,导致74hc123工作不正常。现在把板子上的74hc123去掉,把一块138的6脚接vcc,另一块138的4脚接地,让138正常工作,显示就正常了。 |
ICi是STC5608,晶振18。432 |
需要审核所,我以为没发得起,反复发了几次, 这程序是以前的,很多对你没什么用,比如EEP串口通信等,当时编得不是很好,你取你需要的部分就成 |
#include <STC12C54.H> #include <intrins.h> #include <absacc.h> #include <math.h> #define unchar unsigned char #define unint unsigned int /*****************关键值*********************/ //COM通信修改项 #define COM_ADDRES_G 0x00 //广播通信地址16进制 #define com_in_data0 0xBE // 接收开始位 #define com_in_close 0x0D // 接收结束位 //新旧屏修改项 //#define EN_on 1 //扫描开 //0 新旧屏相关 //电信旧屏为0 //熊屏为1 #define EN_off !EN_on //扫描 //1 //改屏字数时修改项 #define PIN_ZI 5 //屏总字数 //4 #define RAM_SHU 32*(PIN_ZI/2) //缓冲数组大小int //32*(PIN_ZI/2) #define H2_ZI 4 //第二行字中数字加入到第几个字中间 #define ZHI_HH 17 //数据行数 //4 #define COM_MAX 77 //com最大接收数 #define XIAN_id 13 //窗口号放在第几行 /****************函数申明区************************************/ //sfr AUXR = 0x8e; void IAP_XIE (unsigned char IAP_DATA,unsigned char ADDH,unsigned char ADDL); unsigned char IAP_DU (unsigned char ADDH,unsigned char ADDL); void IAP_CACHU (unsigned char ADDH,unsigned char ADDL); void INSZ8(void); void com_out(void); unsigned char hextoasc(unsigned char ascc); //输入hex码值,输出 ascii码 unsigned char ASC_TO_HEX(unsigned char ascH,unsigned char ascL); //输出hex码值,输入 ascii码 void CHU_SHI(void); /* ISP_IAP_寄存器 */ sfr ISP_DATA = 0xe2; sfr ISP_ADDRH = 0xe3; sfr ISP_ADDRL = 0xe4; sfr ISP_CMD = 0xe5; sfr ISP_TRIG = 0xe6; sfr ISP_CONTR = 0xe7; //IO端口定义 sbit AA = P1^0; sbit BB = P1^1; sbit CC = P1^2; sbit EN = P1^4; //34 sbit DD = P1^3; sbit R1_DAT = P1^5; //33 sbit ST_RCK = P1^6; //1.6 C5 sbit CK_CLK = P1^7; //1.7 sbit LED = P3^5; // P3^5; sbit K2_A = P3^2; sbit K3_B = P3^4; //---------------------------- sbit IN_1 = P3^7; //sbit RE = P3^5; //485发送控制 //sbit LED = P3^7; //全局变量定义 unchar da_H; //显示扫描行数 unsigned int xdata ZHUO_DA; unchar zi; //左移字数累加 unsigned int xdata DAT_RAM2[RAM_SHU]; //显示扫描缓冲区 unsigned char com_i; //5/26 bit com_q; unsigned char data COM_R[COM_MAX]; //接收数据缓存 //77 bit COM_OK; //写入数据完成标志位 bit Zhi_b; //写入数据完成标志位 unsigned char idata H_ZHI[16]; //每行字数 unsigned char Zhi_h,chisu; //当前显示字区 unsigned char YI_F; //移动方向选取 unsigned char idata COM_DATA[6],COM_ADDRES; // 4 unsigned int PAI; //排队等候时间 unsigned char QIE; //切换时间 bit Zhi_ZHI; //字移完成标志位 unsigned char Z_H ; //字数最大行数 unsigned char Z_LMAX ; // Z_LMAX=PIN_ZI*2 //扫描字数移位确认 unsigned char SHU_1_14; //上移绶冲开始位 unsigned int time_s; bit EN_on; // 输出EN驱动反向控制位 bit PIN_ADD_b; //屏地址更改标志位 bit S1_b,S2_b,S3_b,in_b,hl_b; //按键状态标志位 unsigned char IN_HL; //输入数据高电平/低电平有效 unsigned char IN_time; //bit ddd; //叫号闪烁时间清零标志 unsigned char xdata YI_DONG_SD[15] ; //移动速度 unsigned char xdata YI_DONG_FX[15] ; //移动方向选取 unsigned char xdata XIAN_SI_YS[15] ; //显示延时 unsigned char xdata JIAO_HAO_1[15] ; //叫号1 unsigned char xdata JIAO_HAO_X[15] ; //叫号显示与否标志位 unsigned char xdata XIAN_SI_CS[15] ; //显示次数 unsigned char xdata TING_LUI_SJ[15] ; //停留时间 unsigned char xdata JIAO_HAO_CS[15] ; //叫号闪动次数 //unsigned int H1_wwww ; //第一行字中数字加入到第几个字中间 // unsigned char COM_EN; //unsigned char time_d ; //unsigned int xdata DAT_XIAN_ID[17]; //窗口号显示扫描缓冲区 unsigned char code Dat_pin[]= {//横向取模左高位,数据排列:从左到右从上到下 0x00,0x00,0x7C,0xC6,0xC6,0xCE,0xD6,0xD6, // -0- 0xE6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00, 0x00,0x00,0x18,0x38,0x78,0x18,0x18,0x18, // -1- 0x18,0x18,0x18,0x7E,0x00,0x00,0x00,0x00, 0x00,0x00,0x7C,0xC6,0x06,0x0C,0x18,0x30, // -2- 0x60,0xC0,0xC6,0xFE,0x00,0x00,0x00,0x00, 0x00,0x00,0x7C,0xC6,0x06,0x06,0x3C,0x06, // -3- 0x06,0x06,0xC6,0x7C,0x00,0x00,0x00,0x00, 0x00,0x00,0x0C,0x1C,0x3C,0x6C,0xCC,0xFE, // -4- 0x0C,0x0C,0x0C,0x1E,0x00,0x00,0x00,0x00, 0x00,0x00,0xFE,0xC0,0xC0,0xC0,0xFC,0x0E, // -5- 0x06,0x06,0xC6,0x7C,0x00,0x00,0x00,0x00, 0x00,0x00,0x38,0x60,0xC0,0xC0,0xFC,0xC6, // -6- 0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00, 0x00,0x00,0xFE,0xC6,0x06,0x06,0x0C,0x18, // -7- 0x30,0x30,0x30,0x30,0x00,0x00,0x00,0x00, 0x00,0x00,0x7C,0xC6,0xC6,0xC6,0x7C,0xC6, // -8- 0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00, 0x00,0x00,0x7C,0xC6,0xC6,0xC6,0x7E,0x06, // -9- 0x06,0x06,0x0C,0x78,0x00,0x00,0x00,0x00, 0x00,0x00,0x10,0x38,0x6C,0xC6,0xC6,0xFE, // -A- 0xC6,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00, 0x00,0x00,0xFC,0x66,0x66,0x66,0x7C,0x66, // -B- 0x66,0x66,0x66,0xFC,0x00,0x00,0x00,0x00, 0x00,0x00,0x3C,0x66,0xC2,0xC0,0xC0,0xC0, // -C- 0xC0,0xC2,0x66,0x3C,0x00,0x00,0x00,0x00, 0x00,0x00,0xF8,0x6C,0x66,0x66,0x66,0x66, // -D- 0x66,0x66,0x6C,0xF8,0x00,0x00,0x00,0x00, 0x00,0x00,0xFE,0x66,0x62,0x68,0x78,0x68, // -E- 0x60,0x62,0x66,0xFE,0x00,0x00,0x00,0x00, 0x00,0x00,0xFE,0x66,0x62,0x68,0x78,0x68, // -F- 0x60,0x60,0x60,0xF0,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // --- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, }; |
一次发不了太多 |
/*版 本: 1.0 */ #include <STC12C54.H> #include <intrins.h> #include <absacc.h> #include <math.h> #define unchar unsigned char #define unint unsigned int /*****************关键值*********************/ //COM通信修改项 #define COM_ADDRES_G 0x00 //广播通信地址16进制 #define com_in_data0 0xBE // 接收开始位 #define com_in_close 0x0D // 接收结束位 //新旧屏修改项 //#define EN_on 1 //扫描开 //0 新旧屏相关 //电信旧屏为0 //熊屏为1 #define EN_off !EN_on //扫描 //1 //改屏字数时修改项 #define PIN_ZI 5 //屏总字数 //4 #define RAM_SHU 32*(PIN_ZI/2) //缓冲数组大小int //32*(PIN_ZI/2) #define H2_ZI 4 //第二行字中数字加入到第几个字中间 #define ZHI_HH 17 //数据行数 //4 #define COM_MAX 77 //com最大接收数 #define XIAN_id 13 //窗口号放在第几行 /****************函数申明区************************************/ //sfr AUXR = 0x8e; void IAP_XIE (unsigned char IAP_DATA,unsigned char ADDH,unsigned char ADDL); unsigned char IAP_DU (unsigned char ADDH,unsigned char ADDL); void IAP_CACHU (unsigned char ADDH,unsigned char ADDL); void INSZ8(void); void com_out(void); unsigned char hextoasc(unsigned char ascc); //输入hex码值,输出 ascii码 unsigned char ASC_TO_HEX(unsigned char ascH,unsigned char ascL); //输出hex码值,输入 ascii码 void CHU_SHI(void); /* ISP_IAP_寄存器 */ sfr ISP_DATA = 0xe2; sfr ISP_ADDRH = 0xe3; sfr ISP_ADDRL = 0xe4; sfr ISP_CMD = 0xe5; sfr ISP_TRIG = 0xe6; sfr ISP_CONTR = 0xe7; //IO端口定义 sbit AA = P1^0; sbit BB = P1^1; sbit CC = P1^2; sbit EN = P1^4; //34 sbit DD = P1^3; sbit R1_DAT = P1^5; //33 sbit ST_RCK = P1^6; //1.6 C5 sbit CK_CLK = P1^7; //1.7 sbit LED = P3^5; // P3^5; sbit K2_A = P3^2; sbit K3_B = P3^4; //---------------------------- sbit IN_1 = P3^7; //sbit RE = P3^5; //485发送控制 //sbit LED = P3^7; //全局变量定义 unchar da_H; //显示扫描行数 unsigned int xdata ZHUO_DA; unchar zi; //左移字数累加 unsigned int xdata DAT_RAM2[RAM_SHU]; //显示扫描缓冲区 unsigned char com_i; //5/26 bit com_q; unsigned char data COM_R[COM_MAX]; //接收数据缓存 //77 bit COM_OK; //写入数据完成标志位 bit Zhi_b; //写入数据完成标志位 unsigned char idata H_ZHI[16]; //每行字数 unsigned char Zhi_h,chisu; //当前显示字区 unsigned char YI_F; //移动方向选取 unsigned char idata COM_DATA[6],COM_ADDRES; // 4 unsigned int PAI; //排队等候时间 unsigned char QIE; //切换时间 bit Zhi_ZHI; //字移完成标志位 unsigned char Z_H ; //字数最大行数 unsigned char Z_LMAX ; // Z_LMAX=PIN_ZI*2 //扫描字数移位确认 unsigned char SHU_1_14; //上移绶冲开始位 unsigned int time_s; bit EN_on; // 输出EN驱动反向控制位 bit PIN_ADD_b; //屏地址更改标志位 bit S1_b,S2_b,S3_b,in_b,hl_b; //按键状态标志位 unsigned char IN_HL; //输入数据高电平/低电平有效 unsigned char IN_time; //bit ddd; //叫号闪烁时间清零标志 unsigned char xdata YI_DONG_SD[15] ; //移动速度 unsigned char xdata YI_DONG_FX[15] ; //移动方向选取 unsigned char xdata XIAN_SI_YS[15] ; //显示延时 unsigned char xdata JIAO_HAO_1[15] ; //叫号1 unsigned char xdata JIAO_HAO_X[15] ; //叫号显示与否标志位 unsigned char xdata XIAN_SI_CS[15] ; //显示次数 unsigned char xdata TING_LUI_SJ[15] ; //停留时间 unsigned char xdata JIAO_HAO_CS[15] ; //叫号闪动次数 //unsigned int H1_wwww ; //第一行字中数字加入到第几个字中间 // unsigned char COM_EN; //unsigned char time_d ; //unsigned int xdata DAT_XIAN_ID[17]; //窗口号显示扫描缓冲区 unsigned char code Dat_pin[]= {//横向取模左高位,数据排列:从左到右从上到下 0x00,0x00,0x7C,0xC6,0xC6,0xCE,0xD6,0xD6, // -0- 0xE6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00, 0x00,0x00,0x18,0x38,0x78,0x18,0x18,0x18, // -1- 0x18,0x18,0x18,0x7E,0x00,0x00,0x00,0x00, 0x00,0x00,0x7C,0xC6,0x06,0x0C,0x18,0x30, // -2- 0x60,0xC0,0xC6,0xFE,0x00,0x00,0x00,0x00, 0x00,0x00,0x7C,0xC6,0x06,0x06,0x3C,0x06, // -3- 0x06,0x06,0xC6,0x7C,0x00,0x00,0x00,0x00, 0x00,0x00,0x0C,0x1C,0x3C,0x6C,0xCC,0xFE, // -4- 0x0C,0x0C,0x0C,0x1E,0x00,0x00,0x00,0x00, 0x00,0x00,0xFE,0xC0,0xC0,0xC0,0xFC,0x0E, // -5- 0x06,0x06,0xC6,0x7C,0x00,0x00,0x00,0x00, 0x00,0x00,0x38,0x60,0xC0,0xC0,0xFC,0xC6, // -6- 0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00, 0x00,0x00,0xFE,0xC6,0x06,0x06,0x0C,0x18, // -7- 0x30,0x30,0x30,0x30,0x00,0x00,0x00,0x00, 0x00,0x00,0x7C,0xC6,0xC6,0xC6,0x7C,0xC6, // -8- 0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00, 0x00,0x00,0x7C,0xC6,0xC6,0xC6,0x7E,0x06, // -9- 0x06,0x06,0x0C,0x78,0x00,0x00,0x00,0x00, 0x00,0x00,0x10,0x38,0x6C,0xC6,0xC6,0xFE, // -A- 0xC6,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00, 0x00,0x00,0xFC,0x66,0x66,0x66,0x7C,0x66, // -B- 0x66,0x66,0x66,0xFC,0x00,0x00,0x00,0x00, 0x00,0x00,0x3C,0x66,0xC2,0xC0,0xC0,0xC0, // -C- 0xC0,0xC2,0x66,0x3C,0x00,0x00,0x00,0x00, 0x00,0x00,0xF8,0x6C,0x66,0x66,0x66,0x66, // -D- 0x66,0x66,0x6C,0xF8,0x00,0x00,0x00,0x00, 0x00,0x00,0xFE,0x66,0x62,0x68,0x78,0x68, // -E- 0x60,0x62,0x66,0xFE,0x00,0x00,0x00,0x00, 0x00,0x00,0xFE,0x66,0x62,0x68,0x78,0x68, // -F- 0x60,0x60,0x60,0xF0,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // --- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, }; /****************中断处理程序区**************************************/ void extern0_ISR() interrupt 0 {} void timer0_ISR () interrupt 1 { unchar i,j,k; //12M 1.5MS中断一次 unint da_k; TL0 = 0x78; TH0 = 0xfa; TR0 = 0; // EA = 0; TF0 = 0; //time0中断请求标志位 if(da_H>15) da_H=0; j=da_H*PIN_ZI; for (k=0;k<PIN_ZI;k++) //12 { da_k=DAT_RAM2[j+k]; for (i=0;i<16;i++) { if(da_k&0x8000) R1_DAT = 0; else R1_DAT = 1; _nop_(); CK_CLK = 1; _nop_(); CK_CLK = 0; da_k<<=1; } } EN =EN_off; //0 if(da_H>7) { DD=1; } else { DD=0; } if(da_H&0x01) AA=1; else AA=0; if(da_H&0x02) BB=1; else BB=0; if(da_H&0x04) CC=1; else CC=0; ST_RCK = 1; EN =EN_on; ST_RCK = 0; R1_DAT = 0; da_H++; //行加 TR0 = 1; // EA = 1; time_s++; } //通信中断 void serial_ISR () interrupt 4 { unsigned char i,SBUF_lcd; if(RI==1) { SBUF_lcd = SBUF; if(SBUF_lcd==com_in_close) //接收结束位 { i=ASC_TO_HEX(COM_R[0],COM_R[1]); if((i==COM_ADDRES_G)||(i==COM_ADDRES)) com_out(); //写屏 for(i=0;i<com_i;i++) COM_R[i]=0; SBUF_lcd=0; com_i=0; com_q=0; } if(com_q) { COM_R[com_i]=SBUF_lcd; if(com_i<COM_MAX) com_i++; } if(SBUF_lcd==com_in_data0) //接收开始位 { com_q=1; com_i=0; } } RI=0; } void timer2_ISR () interrupt 5{} /* not used */ unsigned char hextoasc(unsigned char ascc) //输入hex码值,输出 ascii码 { if(ascc>47&&ascc<58) return (ascc-48); // if(ascc>64&&ascc<71) if(ascc>64&&ascc<92) return (ascc-55); } unsigned char ASC_TO_HEX(unsigned char ascH,unsigned char ascL) //输出hex码值,输入 ascii码 { unsigned char da; da=hextoasc(ascH); da<<=4; da|=hextoasc(ascL); return da; } void shuzhu (unchar z,unchar h) { unsigned char i; unsigned int b; b=z*32; if(z>H_ZHI[h]) H_ZHI[h]=z; h++; if(h>13) h=13; if(COM_EN) { for(i=0;i<32;i++) { if(b<256) IAP_XIE (COM_R[i],h,b) ; b++; } } } void chan_shu(unchar pp,unchar ma,unchar da) { unchar i; if(COM_EN) { if(pp<6) { i=pp*20; i+=ma; IAP_XIE (da,0x0e,i) ; } else { pp-=6; i=pp*20; i+=ma; IAP_XIE (da,0x0f,i) ; } } } //数据接收处理 void com_out(void ) { unsigned char i,h,z,an,chao_zi,pp; unsigned int com_k; unsigned char com_x; z=ASC_TO_HEX(COM_R[6],COM_R[7]); h=ASC_TO_HEX(COM_R[4],COM_R[5]); chao_zi=ASC_TO_HEX(COM_R[2],COM_R[3]); if(chao_zi==0x04||chao_zi==0x05) { com_x=ASC_TO_HEX(COM_R[com_i-2],COM_R[com_i-1]); com_k=0; for(i=0;i<com_i-2;i++) { com_k+=ASC_TO_HEX(COM_R[i],COM_R[i+1]); i++; } com_k%=0xff; if(com_x!=com_k) return ; } if(chao_zi==0x04) //操作码清EEP //操作码1写屏 { //if(h==0) if(!h&&(com_i==10||com_i==12)) //=0 { COM_EN=1; EN =EN_off; TR0 = 0; ET0=0; //time0中断允许控制位 for(i=0;i<13;i++) //5608eep为0x00--0x0F 共4K { IAP_CACHU (i,0); //清空EEP i++; } for(i=0;i<ZHI_HH;i++) H_ZHI[i]=0; } else // if(h==1) // if(h==1&&(com_i==8||com_i==12)) { for(i=0;i<ZHI_HH;i++) { IAP_XIE (H_ZHI[i],0x0d,210+i) ; } } } else if(chao_zi==0x01) //操作码清EEP //操作码1写屏 { if(com_i<60) { for(i=8;i<72;i++) COM_R[i]= 0x00; } an=0 ; for(i=8;i<72;i++) { COM_R[an]= ASC_TO_HEX(COM_R[i],COM_R[i+1]); i++; an++; } if(h>Z_H) Z_H = h ; //字数最大行数 shuzhu (z,h) ; //写入数据 } else if(chao_zi==0x05) //操作码清EEP //操作码1写屏 { if(!h&&com_i==12) //=0 { EN =EN_off; COM_EN=1; TR0 = 0; ET0=0; //time0中断允许控制位 IAP_CACHU (0x0f,0); //清空EEP PIN_ADD_b=1; //屏地址更改标志位 } else if(h==1&&com_i==12) { COM_OK=1; //写入数据完成标志位 COM_EN=0; } } else if(chao_zi==0x03) //操作码参数设置 { // H1_wwww=0; if(h==4&&PIN_ADD_b) //写入屏地址 PIN_ADD_b=0; //屏地址更改标志位 { z=ASC_TO_HEX(COM_R[6],COM_R[7]); IAP_XIE (z,0x0F,250) ; COM_ADDRES= IAP_DU (0x0f,250); PIN_ADD_b=0; //屏地址更改标志位 } else if(COM_EN) //写入屏地址 { if(h==0x0d) //写入屏地址 { z=ASC_TO_HEX(COM_R[6],COM_R[7]); IAP_XIE (z,0x0F,251) ; } else { pp=ASC_TO_HEX(COM_R[8],COM_R[9]); chan_shu(pp,h,z) ; } } } INSZ8(); } void IAP_FUWEI (void) { ISP_CONTR=0x00; ISP_CMD=0x00; ISP_TRIG=0x00; ISP_ADDRH=0xff; ISP_ADDRL=0xff; //ISP_DATA=0xff; } /*读*/ unsigned char IAP_DU (unsigned char ADDH,unsigned char ADDL) { ISP_ADDRH=ADDH; ISP_ADDRL=ADDL; ISP_CMD=0x01; ISP_CONTR=0x84; ISP_TRIG=0x46; ISP_TRIG=0xB9; IAP_FUWEI(); return ISP_DATA; } /*写*/ void IAP_XIE (unsigned char IAP_DATA,unsigned char ADDH,unsigned char ADDL) { ISP_ADDRH=ADDH; ISP_ADDRL=ADDL; ISP_DATA=IAP_DATA; ISP_CMD=0x02; ISP_CONTR=0x84; ISP_TRIG=0x46; ISP_TRIG=0xB9; IAP_FUWEI(); } /*擦除*/ void IAP_CACHU (unsigned char ADDH,unsigned char ADDL) { ISP_ADDRH=ADDH; ISP_ADDRL=ADDL; ISP_CMD=0x03; ISP_CONTR=0x84; ISP_TRIG=0x46; ISP_TRIG=0xB9; IAP_FUWEI(); } /*****************延迟DELAY******************** **/ void delay(unsigned int a) //1-50ms /24M { unsigned int i; for(;a>0;a--) for(i=0;i<9988;i++) WDT_CONTR = 0x3C; //狗;; } void XIE_RAM2 (unchar zhi_ju,unchar DAT_R,unchar di,bit a) { unsigned char shuzhu,dat_i,i,ADDH,w; unsigned int k,da_k; di=0; if(zi>=DAT_R) { Zhi_ZHI=1; return ; } i=0; ADDH = zhi_ju; //取扇区地址 for(dat_i=0;dat_i<16;dat_i++) { for(shuzhu=0;shuzhu<PIN_ZI;shuzhu++) // PIN_ZI { if(a) { if(shuzhu==di) { k=(COM_DATA[0]*16)+dat_i; DAT_RAM2[i]=Dat_pin[k]; DAT_RAM2[i]<<=8; k=(COM_DATA[1]*16)+dat_i; DAT_RAM2[i]|=Dat_pin[k]; i++; } else if(shuzhu==di+1) { k=(COM_DATA[2]*16)+dat_i; DAT_RAM2[i]=Dat_pin[k]; DAT_RAM2[i]<<=8; k=(COM_DATA[3]*16)+dat_i; DAT_RAM2[i]|=Dat_pin[k]; i++; } else if(shuzhu==di+2) { k=(COM_DATA[4]*16)+dat_i; DAT_RAM2[i]=Dat_pin[k]; DAT_RAM2[i]<<=8; k=(COM_DATA[5]*16)+dat_i; DAT_RAM2[i]|=Dat_pin[k]; i++; } /* else if(shuzhu==4) { DAT_RAM2[i]=0; i++; } */ else goto xei_2; } else { xei_2: da_k=shuzhu*32; k= dat_i+dat_i+da_k; // if(k<256) { DAT_RAM2[i]=IAP_DU (ADDH,k); } else { w=k-256; DAT_RAM2[i]=IAP_DU (ADDH+1,w); } DAT_RAM2[i]<<=8; k++; if(k<256) { DAT_RAM2[i]|=IAP_DU (ADDH,k); } else { w=k-256; DAT_RAM2[i]|=IAP_DU (ADDH+1,w); } i++; //字总数0-3 总计4个字 } } } // zi+=4; } QING_RAM2() { unsigned char dat_i; for(dat_i=0;dat_i<RAM_SHU;dat_i++) DAT_RAM2[dat_i]=0; // for(dat_i=0;dat_i<16;dat_i++) // DAT_XIAN_ID[dat_i]=0; } //开启显示定时扫描 void dingsi(void) { TMOD |= 0x01; TH0 = 0xF8; TL0 = 0x2f; ET0=1; TR0=1; EA=1; PT0=1; //优先级 } //程序初始化 void CHU_SHI(void) { unsigned char i,z,an; EN =EN_off; //关显示屏 dingsi(); //开启显示扫描定时 QING_RAM2(); //清显示缓冲区RAM2内存 delay(10); //开机延迟 COM_OK=0; //写入数据完成标志位清零 Zhi_h=0; //当前显示字区默认为0 Zhi_b=0; //调用显示标志位清零 COM_ADDRES=IAP_DU (0x0f,250); //本机地址 z= IAP_DU (0x0f,251); // if(z) EN_on=1; //显示屏亮度--1----------------------------------------------------------- // else // EN_on=0; for(i=0;i<14;i++) { if(i<6) { z=i*20; an=0x0e; } else { z=(i-6)*20; an=0x0f; } } Z_LMAX=PIN_ZI*2; SHU_1_14=RAM_SHU-PIN_ZI; } void chunchu_A( sw,sb,sg,add1) { IAP_CACHU (add1,0); //清空EEP 3扇区 IAP_XIE (sw,add1,200) ; IAP_XIE (sb,add1,201) ; IAP_XIE (sg,add1,202) ; } unsigned char jp(unsigned char an) { unsigned char i; switch(an) { case 2: //K2_A组 WDT_CONTR = 0x3C; //狗;; if(S2_b==0) //K2_A { EXIT1 : if(K2_A==0) { for(i=0;i<100;i++) ; if(K2_A!=0) goto EXIT1; S2_b=1; return 1; } } else { if(K2_A==1) { S2_b=0; return 0; } } break; case 3: //K3_B组 if(S3_b==0) { EXIT2 : if(K3_B==0) { for(i=0;i<100;i++) ; if(K3_B!=0) goto EXIT2; S3_b=1; return 1; } } else { if(K3_B==1) { S3_b=0; return 0; } } break; } } unsigned char jp5S(unsigned char an) { unsigned char n; unsigned int i; switch(an) { case 2: //K2_A组 按纽2清除A/B组数据 WDT_CONTR = 0x3C; //狗;; if(S2_b==0) //K2_A 按纽2清除A/B组数据 { EXIT21 : if(K2_A==0) { for(n=0;n<5;n++) { for(i=0;i<6000;i++) ; delay(36); //延迟 // WDT_CONTR = 0x3C; //狗;; if(K2_A!=0) goto EXIT21; for(i=0;i<6000;i++) ; delay(36); //延迟 if(K2_A!=0) goto EXIT21; for(i=0;i<6000;i++) ; delay(36); //延迟 if(K2_A!=0) goto EXIT21; } for(i=0;i<100;i++) ; if(K2_A!=0) goto EXIT21; S2_b=1; return 1; } } else { if(K2_A==1) { S2_b=0; return 0; } } break; case 3: //K3_B组 if(S3_b==0) { EXIT32 : if(K3_B==0) { for(n=0;n<5;n++) { for(i=0;i<6000;i++) ; delay(36); //延迟 if(K3_B!=0) goto EXIT32; for(i=0;i<6000;i++) ; delay(36); //延迟 if(K3_B!=0) goto EXIT32; for(i=0;i<6000;i++) ; delay(36); //延迟 if(K3_B!=0) goto EXIT32; } S3_b=1; return 1; } } else { if(K3_B==1) { S3_b=0; return 0; } } break; } } void set_IN_HL(void) { unsigned char i,w,bei; w= IAP_DU (0x0A,204); bei=w; if(w>0) w=1; COM_DATA[0] =12; COM_DATA[1] =0; COM_DATA[2] =0; COM_DATA[3] =0; COM_DATA[5] =0; COM_DATA[4] =w; //最后一位 XIE_RAM2(1,16,0,1); //显示当前A值 for(i=0;i<50;i++) { if(jp(3)==1) { w=!w; COM_DATA[0] =12; COM_DATA[1] =0; COM_DATA[2] =0; COM_DATA[3] =0; COM_DATA[5] =0; COM_DATA[4] =w; //最后一位 XIE_RAM2(1,16,0,1); //显示当前A值 } delay(20) ; } delay(200) ; if(bei!=w) { QING_RAM2(); //清显示缓冲区RAM2内存 delay(10) ; IAP_CACHU (0x0A,0); //清空EEP 3扇区 IAP_XIE (w,0x0A,204) ; } } void set_IN_time(void) { unsigned char i,w,bei; w= IAP_DU (0x0c,204); bei=w; // if(w>0) // w=1; COM_DATA[0] =13; COM_DATA[1] =0; COM_DATA[2] =0; COM_DATA[3] =0; COM_DATA[5] =0; COM_DATA[4] =w; //最后一位 XIE_RAM2(1,16,0,1); //显示当前A值 for(i=0;i<100;i++) { if(jp(3)==1) { w++; COM_DATA[0] =13; COM_DATA[1] =0; COM_DATA[2] =0; COM_DATA[3] =0; COM_DATA[5] =0; COM_DATA[4] =w; //最后一位 XIE_RAM2(1,16,0,1); //显示当前A值 } else if(jp(2)==1) { w--; COM_DATA[0] =13; COM_DATA[1] =0; COM_DATA[2] =0; COM_DATA[3] =0; COM_DATA[5] =0; COM_DATA[4] =w; //最后一位 XIE_RAM2(1,16,0,1); //显示当前A值 } delay(20) ; } delay(200) ; QING_RAM2(); //清显示缓冲区RAM2内存 delay(10) ; IAP_CACHU (0x0c,0); //清空EEP 3扇区 IAP_XIE (w,0x0c,204) ; } unsigned char IN_j(void) { unsigned int i; if(in_b==0) { EXIT3 : WDT_CONTR = 0x3C; //狗;; if(IN_1==hl_b) { for(i=0;i<6000;i++) ; delay(IN_time); //延迟 if(IN_1!=hl_b) goto EXIT3; if(IN_1==hl_b) for(i=0;i<6000;i++) ; delay(IN_time); //开机延迟 if(IN_1!=hl_b) goto EXIT3; in_b=1; return 1; } } else { if(IN_1!=hl_b) { in_b=0; return 0; } } } void xianshi(unchar a0,unchar a1,unchar a2,unchar a3,unchar a4 ) { COM_DATA[1]=a0 ; COM_DATA[2]=a1 ; COM_DATA[3]=a2 ; COM_DATA[4]=a3; COM_DATA[5]=a4 ; COM_DATA[0]=16 ; XIE_RAM2(Zhi_h+1,H_ZHI[Zhi_h],JIAO_HAO_1[Zhi_h],JIAO_HAO_1[Zhi_h]); // XIE_RAM2(1,16,0,1); //显示当前A值 } /********************8位接收设置**********************/ void INSZ8(void) { SCON = 0x50; // 晶振18.432M PCON |=0x80; TMOD |= 0X20; TMOD &= 0XEF; TH1 = 0XF6; //9600 晶振18.432M TL1 = 0xf6; TR1=1; IE |= 0x90; // RE = 0; } // /*****************主程序区****************************/ void main(void) { unsigned char idata i,ab_ch; unsigned int idata time_f; unsigned char idata ucdata_B[3]; bit A_B,time_bit,ab_b; delay(1); //开机延迟 dingsi(); //开启显示扫描定时 zi=0; Zhi_ZHI=0; time_s=0; da_H=0;//行扫开始值 CHU_SHI(); //初始化 INSZ8(); //开启串口接收 18.432M-19200--------------- if(jp5S(3)==1) set_IN_HL() ; // 输入端高低电平有效位设置 if(jp5S(2)==1) set_IN_time() ; time_bit=0 ; //是否有数据需要保存标志位 A_B=0; //显示A/B组标志位 IN_HL= IAP_DU (0x0A,204); //读出输入端高低电平为有效位 IN_time= IAP_DU (0x0c,204); if(IN_time>200) { IN_time=5; IAP_CACHU (0x0c,0); //清空EEP 3扇区 IAP_XIE (IN_time,0x0c,204) ; } if(IN_HL>0) hl_b=0; else hl_b=1; in_b=1; //防止误动作 xianshi(10,11,16,16,16 ) ; //B delay(100) ; i=IAP_DU (0x04,200); if(i>99) ucdata_B[0]=0; else ucdata_B[0]= i ; i=IAP_DU (0x04,201); if(i>99) ucdata_B[1]=0; else ucdata_B[1]= i ; i=IAP_DU (0x04,202); if(i>99) ucdata_B[2]=0; else ucdata_B[2]= i ; xianshi(ucdata_B[2]%10,ucdata_B[1]/10,ucdata_B[1]%10,ucdata_B[0]/10,ucdata_B[0]%10 ) ; ////显示当前值B /* delay(200) ; xianshi(10,16,16,16,16 ) ; //A delay(200) ; i=IAP_DU (0x03,200); if(i>99) ucdata[0]=0; else ucdata[0]= i ; i=IAP_DU (0x03,201); if(i>99) ucdata[1]=0; else ucdata[1]= i ; i=IAP_DU (0x03,202); if(i>99) ucdata[2]=0; else ucdata[2]= i ; */ // xianshi(ucdata[2]%10,ucdata[1]/10,ucdata[1]%10,ucdata[0]/10,ucdata[0]%10 ) ; //显示当前A值 while(1) { open: WDT_CONTR = 0x3C; //狗; delay(1) ; i=1; for(i=0;i<3;i++); if(IN_j()==1) //有数据输入 { if(ucdata_B[0]>=99) { ucdata_B[0]=0; if(ucdata_B[1]>=99) { ucdata_B[1]=0; if(ucdata_B[2]>=99) ucdata_B[2]=0; else ucdata_B[2]++; } else ucdata_B[1]++; } else ucdata_B[0]++; xianshi(ucdata_B[2]%10,ucdata_B[1]/10,ucdata_B[1]%10,ucdata_B[0]/10,ucdata_B[0]%10 ) ; ////显示当前值B time_f=0; time_s=0; time_bit=1; ab_b=0; } if(time_s>60000&&time_bit) { time_f++; time_s=0; if(time_f>5) // { time_bit=0; time_f=0; chunchu_A(ucdata_B[0],ucdata_B[1],ucdata_B[2],0x04); } } if(jp5S(3)==1)//按纽3显示B组数据 { xianshi(11,ucdata_B[1]/10,ucdata_B[1]%10,ucdata_B[0]/10,ucdata_B[0]%10 ) ; ////显示当前值B ab_b=1; ab_ch=0; } else { if(ab_b) { ab_ch++; if(ab_ch>100) { chunchu_A(ucdata_B[0],ucdata_B[1],ucdata_B[2],0x04); xianshi(ucdata_B[2]%10,ucdata_B[1]/10,ucdata_B[1]%10,ucdata_B[0]/10,ucdata_B[0]%10 ) ; ////显示当前值B ab_b=0; } } } if(jp5S(2)==1)//按纽2清除A/B组数据 { ucdata_B[0]=0; ucdata_B[1]=0; ucdata_B[2]=0; QING_RAM2(); //清显示缓冲区RAM2内存 delay(10) ; chunchu_A(ucdata_B[0],ucdata_B[1],ucdata_B[2],0x04); xianshi(ucdata_B[2]%10,ucdata_B[1]/10,ucdata_B[1]%10,ucdata_B[0]/10,ucdata_B[0]%10 ) ; ////显示当前值B } goto open; } } /* 程序完成时间: */ |
/*版 本: 1.0 */ #include <STC12C54.H> #include <intrins.h> #include <absacc.h> #include <math.h> #define unchar unsigned char #define unint unsigned int /*****************关键值*********************/ //COM通信修改项 #define COM_ADDRES_G 0x00 //广播通信地址16进制 #define com_in_data0 0xBE // 接收开始位 #define com_in_close 0x0D // 接收结束位 //新旧屏修改项 //#define EN_on 1 //扫描开 //0 新旧屏相关 //电信旧屏为0 //熊屏为1 #define EN_off !EN_on //扫描 //1 //改屏字数时修改项 #define PIN_ZI 5 //屏总字数 //4 #define RAM_SHU 32*(PIN_ZI/2) //缓冲数组大小int //32*(PIN_ZI/2) #define H2_ZI 4 //第二行字中数字加入到第几个字中间 #define ZHI_HH 17 //数据行数 //4 #define COM_MAX 77 //com最大接收数 #define XIAN_id 13 //窗口号放在第几行 /****************函数申明区************************************/ //sfr AUXR = 0x8e; void IAP_XIE (unsigned char IAP_DATA,unsigned char ADDH,unsigned char ADDL); unsigned char IAP_DU (unsigned char ADDH,unsigned char ADDL); void IAP_CACHU (unsigned char ADDH,unsigned char ADDL); void INSZ8(void); void com_out(void); unsigned char hextoasc(unsigned char ascc); //输入hex码值,输出 ascii码 unsigned char ASC_TO_HEX(unsigned char ascH,unsigned char ascL); //输出hex码值,输入 ascii码 void CHU_SHI(void); /* ISP_IAP_寄存器 */ sfr ISP_DATA = 0xe2; sfr ISP_ADDRH = 0xe3; sfr ISP_ADDRL = 0xe4; sfr ISP_CMD = 0xe5; sfr ISP_TRIG = 0xe6; sfr ISP_CONTR = 0xe7; //IO端口定义 sbit AA = P1^0; sbit BB = P1^1; sbit CC = P1^2; sbit EN = P1^4; //34 sbit DD = P1^3; sbit R1_DAT = P1^5; //33 sbit ST_RCK = P1^6; //1.6 C5 sbit CK_CLK = P1^7; //1.7 sbit LED = P3^5; // P3^5; sbit K2_A = P3^2; sbit K3_B = P3^4; //---------------------------- sbit IN_1 = P3^7; //sbit RE = P3^5; //485发送控制 //sbit LED = P3^7; //全局变量定义 unchar da_H; //显示扫描行数 unsigned int xdata ZHUO_DA; unchar zi; //左移字数累加 unsigned int xdata DAT_RAM2[RAM_SHU]; //显示扫描缓冲区 unsigned char com_i; //5/26 bit com_q; unsigned char data COM_R[COM_MAX]; //接收数据缓存 //77 bit COM_OK; //写入数据完成标志位 bit Zhi_b; //写入数据完成标志位 unsigned char idata H_ZHI[16]; //每行字数 unsigned char Zhi_h,chisu; //当前显示字区 unsigned char YI_F; //移动方向选取 unsigned char idata COM_DATA[6],COM_ADDRES; // 4 unsigned int PAI; //排队等候时间 unsigned char QIE; //切换时间 bit Zhi_ZHI; //字移完成标志位 unsigned char Z_H ; //字数最大行数 unsigned char Z_LMAX ; // Z_LMAX=PIN_ZI*2 //扫描字数移位确认 unsigned char SHU_1_14; //上移绶冲开始位 unsigned int time_s; bit EN_on; // 输出EN驱动反向控制位 bit PIN_ADD_b; //屏地址更改标志位 bit S1_b,S2_b,S3_b,in_b,hl_b; //按键状态标志位 unsigned char IN_HL; //输入数据高电平/低电平有效 unsigned char IN_time; //bit ddd; //叫号闪烁时间清零标志 unsigned char xdata YI_DONG_SD[15] ; //移动速度 unsigned char xdata YI_DONG_FX[15] ; //移动方向选取 unsigned char xdata XIAN_SI_YS[15] ; //显示延时 unsigned char xdata JIAO_HAO_1[15] ; //叫号1 unsigned char xdata JIAO_HAO_X[15] ; //叫号显示与否标志位 unsigned char xdata XIAN_SI_CS[15] ; //显示次数 unsigned char xdata TING_LUI_SJ[15] ; //停留时间 unsigned char xdata JIAO_HAO_CS[15] ; //叫号闪动次数 //unsigned int H1_wwww ; //第一行字中数字加入到第几个字中间 // unsigned char COM_EN; //unsigned char time_d ; //unsigned int xdata DAT_XIAN_ID[17]; //窗口号显示扫描缓冲区 unsigned char code Dat_pin[]= {//横向取模左高位,数据排列:从左到右从上到下 0x00,0x00,0x7C,0xC6,0xC6,0xCE,0xD6,0xD6, // -0- 0xE6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00, 0x00,0x00,0x18,0x38,0x78,0x18,0x18,0x18, // -1- 0x18,0x18,0x18,0x7E,0x00,0x00,0x00,0x00, 0x00,0x00,0x7C,0xC6,0x06,0x0C,0x18,0x30, // -2- 0x60,0xC0,0xC6,0xFE,0x00,0x00,0x00,0x00, 0x00,0x00,0x7C,0xC6,0x06,0x06,0x3C,0x06, // -3- 0x06,0x06,0xC6,0x7C,0x00,0x00,0x00,0x00, 0x00,0x00,0x0C,0x1C,0x3C,0x6C,0xCC,0xFE, // -4- 0x0C,0x0C,0x0C,0x1E,0x00,0x00,0x00,0x00, 0x00,0x00,0xFE,0xC0,0xC0,0xC0,0xFC,0x0E, // -5- 0x06,0x06,0xC6,0x7C,0x00,0x00,0x00,0x00, 0x00,0x00,0x38,0x60,0xC0,0xC0,0xFC,0xC6, // -6- 0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00, 0x00,0x00,0xFE,0xC6,0x06,0x06,0x0C,0x18, // -7- 0x30,0x30,0x30,0x30,0x00,0x00,0x00,0x00, 0x00,0x00,0x7C,0xC6,0xC6,0xC6,0x7C,0xC6, // -8- 0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00, 0x00,0x00,0x7C,0xC6,0xC6,0xC6,0x7E,0x06, // -9- 0x06,0x06,0x0C,0x78,0x00,0x00,0x00,0x00, 0x00,0x00,0x10,0x38,0x6C,0xC6,0xC6,0xFE, // -A- 0xC6,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00, 0x00,0x00,0xFC,0x66,0x66,0x66,0x7C,0x66, // -B- 0x66,0x66,0x66,0xFC,0x00,0x00,0x00,0x00, 0x00,0x00,0x3C,0x66,0xC2,0xC0,0xC0,0xC0, // -C- 0xC0,0xC2,0x66,0x3C,0x00,0x00,0x00,0x00, 0x00,0x00,0xF8,0x6C,0x66,0x66,0x66,0x66, // -D- 0x66,0x66,0x6C,0xF8,0x00,0x00,0x00,0x00, 0x00,0x00,0xFE,0x66,0x62,0x68,0x78,0x68, // -E- 0x60,0x62,0x66,0xFE,0x00,0x00,0x00,0x00, 0x00,0x00,0xFE,0x66,0x62,0x68,0x78,0x68, // -F- 0x60,0x60,0x60,0xF0,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // --- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, }; /****************中断处理程序区**************************************/ void extern0_ISR() interrupt 0 {} void timer0_ISR () interrupt 1 { unchar i,j,k; //12M 1.5MS中断一次 unint da_k; TL0 = 0x78; TH0 = 0xfa; TR0 = 0; // EA = 0; TF0 = 0; //time0中断请求标志位 if(da_H>15) da_H=0; j=da_H*PIN_ZI; for (k=0;k<PIN_ZI;k++) //12 { da_k=DAT_RAM2[j+k]; for (i=0;i<16;i++) { if(da_k&0x8000) R1_DAT = 0; else R1_DAT = 1; _nop_(); CK_CLK = 1; _nop_(); CK_CLK = 0; da_k<<=1; } } EN =EN_off; //0 if(da_H>7) { DD=1; } else { DD=0; } if(da_H&0x01) AA=1; else AA=0; if(da_H&0x02) BB=1; else BB=0; if(da_H&0x04) CC=1; else CC=0; ST_RCK = 1; EN =EN_on; ST_RCK = 0; R1_DAT = 0; da_H++; //行加 TR0 = 1; // EA = 1; time_s++; } //通信中断 void serial_ISR () interrupt 4 { unsigned char i,SBUF_lcd; if(RI==1) { SBUF_lcd = SBUF; if(SBUF_lcd==com_in_close) //接收结束位 { i=ASC_TO_HEX(COM_R[0],COM_R[1]); if((i==COM_ADDRES_G)||(i==COM_ADDRES)) com_out(); //写屏 for(i=0;i<com_i;i++) COM_R[i]=0; SBUF_lcd=0; com_i=0; com_q=0; } if(com_q) { COM_R[com_i]=SBUF_lcd; if(com_i<COM_MAX) com_i++; } if(SBUF_lcd==com_in_data0) //接收开始位 { com_q=1; com_i=0; } } RI=0; } void timer2_ISR () interrupt 5{} /* not used */ unsigned char hextoasc(unsigned char ascc) //输入hex码值,输出 ascii码 { if(ascc>47&&ascc<58) return (ascc-48); // if(ascc>64&&ascc<71) if(ascc>64&&ascc<92) return (ascc-55); } unsigned char ASC_TO_HEX(unsigned char ascH,unsigned char ascL) //输出hex码值,输入 ascii码 { unsigned char da; da=hextoasc(ascH); da<<=4; da|=hextoasc(ascL); return da; } void shuzhu (unchar z,unchar h) { unsigned char i; unsigned int b; b=z*32; if(z>H_ZHI[h]) H_ZHI[h]=z; h++; if(h>13) h=13; if(COM_EN) { for(i=0;i<32;i++) { if(b<256) IAP_XIE (COM_R[i],h,b) ; b++; } } } void chan_shu(unchar pp,unchar ma,unchar da) { unchar i; if(COM_EN) { if(pp<6) { i=pp*20; i+=ma; IAP_XIE (da,0x0e,i) ; } else { pp-=6; i=pp*20; i+=ma; IAP_XIE (da,0x0f,i) ; } } } //数据接收处理 void com_out(void ) { unsigned char i,h,z,an,chao_zi,pp; unsigned int com_k; unsigned char com_x; z=ASC_TO_HEX(COM_R[6],COM_R[7]); h=ASC_TO_HEX(COM_R[4],COM_R[5]); chao_zi=ASC_TO_HEX(COM_R[2],COM_R[3]); if(chao_zi==0x04||chao_zi==0x05) { com_x=ASC_TO_HEX(COM_R[com_i-2],COM_R[com_i-1]); com_k=0; for(i=0;i<com_i-2;i++) { com_k+=ASC_TO_HEX(COM_R[i],COM_R[i+1]); i++; } com_k%=0xff; if(com_x!=com_k) return ; } if(chao_zi==0x04) //操作码清EEP //操作码1写屏 { //if(h==0) if(!h&&(com_i==10||com_i==12)) //=0 { COM_EN=1; EN =EN_off; TR0 = 0; ET0=0; //time0中断允许控制位 for(i=0;i<13;i++) //5608eep为0x00--0x0F 共4K { IAP_CACHU (i,0); //清空EEP i++; } for(i=0;i<ZHI_HH;i++) H_ZHI[i]=0; } else // if(h==1) // if(h==1&&(com_i==8||com_i==12)) { for(i=0;i<ZHI_HH;i++) { IAP_XIE (H_ZHI[i],0x0d,210+i) ; } } } else if(chao_zi==0x01) //操作码清EEP //操作码1写屏 { if(com_i<60) { for(i=8;i<72;i++) COM_R[i]= 0x00; } an=0 ; for(i=8;i<72;i++) { COM_R[an]= ASC_TO_HEX(COM_R[i],COM_R[i+1]); i++; an++; } if(h>Z_H) Z_H = h ; //字数最大行数 shuzhu (z,h) ; //写入数据 } else if(chao_zi==0x05) //操作码清EEP //操作码1写屏 { if(!h&&com_i==12) //=0 { EN =EN_off; COM_EN=1; TR0 = 0; ET0=0; //time0中断允许控制位 IAP_CACHU (0x0f,0); //清空EEP PIN_ADD_b=1; //屏地址更改标志位 } else if(h==1&&com_i==12) { COM_OK=1; //写入数据完成标志位 COM_EN=0; } } else if(chao_zi==0x03) //操作码参数设置 { // H1_wwww=0; if(h==4&&PIN_ADD_b) //写入屏地址 PIN_ADD_b=0; //屏地址更改标志位 { z=ASC_TO_HEX(COM_R[6],COM_R[7]); IAP_XIE (z,0x0F,250) ; COM_ADDRES= IAP_DU (0x0f,250); PIN_ADD_b=0; //屏地址更改标志位 } else if(COM_EN) //写入屏地址 { if(h==0x0d) //写入屏地址 { z=ASC_TO_HEX(COM_R[6],COM_R[7]); IAP_XIE (z,0x0F,251) ; } else { pp=ASC_TO_HEX(COM_R[8],COM_R[9]); chan_shu(pp,h,z) ; } } } INSZ8(); } void IAP_FUWEI (void) { ISP_CONTR=0x00; ISP_CMD=0x00; ISP_TRIG=0x00; ISP_ADDRH=0xff; ISP_ADDRL=0xff; //ISP_DATA=0xff; } /*读*/ unsigned char IAP_DU (unsigned char ADDH,unsigned char ADDL) { ISP_ADDRH=ADDH; ISP_ADDRL=ADDL; ISP_CMD=0x01; ISP_CONTR=0x84; ISP_TRIG=0x46; ISP_TRIG=0xB9; IAP_FUWEI(); return ISP_DATA; } /*写*/ void IAP_XIE (unsigned char IAP_DATA,unsigned char ADDH,unsigned char ADDL) { ISP_ADDRH=ADDH; ISP_ADDRL=ADDL; ISP_DATA=IAP_DATA; ISP_CMD=0x02; ISP_CONTR=0x84; ISP_TRIG=0x46; ISP_TRIG=0xB9; IAP_FUWEI(); } /*擦除*/ void IAP_CACHU (unsigned char ADDH,unsigned char ADDL) { ISP_ADDRH=ADDH; ISP_ADDRL=ADDL; ISP_CMD=0x03; ISP_CONTR=0x84; ISP_TRIG=0x46; ISP_TRIG=0xB9; IAP_FUWEI(); } /*****************延迟DELAY******************** **/ void delay(unsigned int a) //1-50ms /24M { unsigned int i; for(;a>0;a--) for(i=0;i<9988;i++) WDT_CONTR = 0x3C; //狗;; } void XIE_RAM2 (unchar zhi_ju,unchar DAT_R,unchar di,bit a) { unsigned char shuzhu,dat_i,i,ADDH,w; unsigned int k,da_k; di=0; if(zi>=DAT_R) { Zhi_ZHI=1; return ; } i=0; ADDH = zhi_ju; //取扇区地址 for(dat_i=0;dat_i<16;dat_i++) { for(shuzhu=0;shuzhu<PIN_ZI;shuzhu++) // PIN_ZI { if(a) { if(shuzhu==di) { k=(COM_DATA[0]*16)+dat_i; DAT_RAM2[i]=Dat_pin[k]; DAT_RAM2[i]<<=8; k=(COM_DATA[1]*16)+dat_i; DAT_RAM2[i]|=Dat_pin[k]; i++; } else if(shuzhu==di+1) { k=(COM_DATA[2]*16)+dat_i; DAT_RAM2[i]=Dat_pin[k]; DAT_RAM2[i]<<=8; k=(COM_DATA[3]*16)+dat_i; DAT_RAM2[i]|=Dat_pin[k]; i++; } else if(shuzhu==di+2) { k=(COM_DATA[4]*16)+dat_i; DAT_RAM2[i]=Dat_pin[k]; DAT_RAM2[i]<<=8; k=(COM_DATA[5]*16)+dat_i; DAT_RAM2[i]|=Dat_pin[k]; i++; } /* else if(shuzhu==4) { DAT_RAM2[i]=0; i++; } */ else goto xei_2; } else { xei_2: da_k=shuzhu*32; k= dat_i+dat_i+da_k; // if(k<256) { DAT_RAM2[i]=IAP_DU (ADDH,k); } else { w=k-256; DAT_RAM2[i]=IAP_DU (ADDH+1,w); } DAT_RAM2[i]<<=8; k++; if(k<256) { DAT_RAM2[i]|=IAP_DU (ADDH,k); } else { w=k-256; DAT_RAM2[i]|=IAP_DU (ADDH+1,w); } i++; //字总数0-3 总计4个字 } } } // zi+=4; } QING_RAM2() { unsigned char dat_i; for(dat_i=0;dat_i<RAM_SHU;dat_i++) DAT_RAM2[dat_i]=0; // for(dat_i=0;dat_i<16;dat_i++) // DAT_XIAN_ID[dat_i]=0; } //开启显示定时扫描 void dingsi(void) { TMOD |= 0x01; TH0 = 0xF8; TL0 = 0x2f; ET0=1; TR0=1; EA=1; PT0=1; //优先级 } //程序初始化 void CHU_SHI(void) { unsigned char i,z,an; EN =EN_off; //关显示屏 dingsi(); //开启显示扫描定时 QING_RAM2(); //清显示缓冲区RAM2内存 delay(10); //开机延迟 COM_OK=0; //写入数据完成标志位清零 Zhi_h=0; //当前显示字区默认为0 Zhi_b=0; //调用显示标志位清零 COM_ADDRES=IAP_DU (0x0f,250); //本机地址 z= IAP_DU (0x0f,251); // if(z) EN_on=1; //显示屏亮度--1----------------------------------------------------------- // else // EN_on=0; for(i=0;i<14;i++) { if(i<6) { z=i*20; an=0x0e; } else { z=(i-6)*20; an=0x0f; } } Z_LMAX=PIN_ZI*2; SHU_1_14=RAM_SHU-PIN_ZI; } void chunchu_A( sw,sb,sg,add1) { IAP_CACHU (add1,0); //清空EEP 3扇区 IAP_XIE (sw,add1,200) ; IAP_XIE (sb,add1,201) ; IAP_XIE (sg,add1,202) ; } unsigned char jp(unsigned char an) { unsigned char i; switch(an) { case 2: //K2_A组 WDT_CONTR = 0x3C; //狗;; if(S2_b==0) //K2_A { EXIT1 : if(K2_A==0) { for(i=0;i<100;i++) ; if(K2_A!=0) goto EXIT1; S2_b=1; return 1; } } else { if(K2_A==1) { S2_b=0; return 0; } } break; case 3: //K3_B组 if(S3_b==0) { EXIT2 : if(K3_B==0) { for(i=0;i<100;i++) ; if(K3_B!=0) goto EXIT2; S3_b=1; return 1; } } else { if(K3_B==1) { S3_b=0; return 0; } } break; } } unsigned char jp5S(unsigned char an) { unsigned char n; unsigned int i; switch(an) { case 2: //K2_A组 按纽2清除A/B组数据 WDT_CONTR = 0x3C; //狗;; if(S2_b==0) //K2_A 按纽2清除A/B组数据 { EXIT21 : if(K2_A==0) { for(n=0;n<5;n++) { for(i=0;i<6000;i++) ; delay(36); //延迟 // WDT_CONTR = 0x3C; //狗;; if(K2_A!=0) goto EXIT21; for(i=0;i<6000;i++) ; delay(36); //延迟 if(K2_A!=0) goto EXIT21; for(i=0;i<6000;i++) ; delay(36); //延迟 if(K2_A!=0) goto EXIT21; } for(i=0;i<100;i++) ; if(K2_A!=0) goto EXIT21; S2_b=1; return 1; } } else { if(K2_A==1) { S2_b=0; return 0; } } break; case 3: //K3_B组 if(S3_b==0) { EXIT32 : if(K3_B==0) { for(n=0;n<5;n++) { for(i=0;i<6000;i++) ; delay(36); //延迟 if(K3_B!=0) goto EXIT32; for(i=0;i<6000;i++) ; delay(36); //延迟 if(K3_B!=0) goto EXIT32; for(i=0;i<6000;i++) ; delay(36); //延迟 if(K3_B!=0) goto EXIT32; } S3_b=1; return 1; } } else { if(K3_B==1) { S3_b=0; return 0; } } break; } } void set_IN_HL(void) { unsigned char i,w,bei; w= IAP_DU (0x0A,204); bei=w; if(w>0) w=1; COM_DATA[0] =12; COM_DATA[1] =0; COM_DATA[2] =0; COM_DATA[3] =0; COM_DATA[5] =0; COM_DATA[4] =w; //最后一位 XIE_RAM2(1,16,0,1); //显示当前A值 for(i=0;i<50;i++) { if(jp(3)==1) { w=!w; COM_DATA[0] =12; COM_DATA[1] =0; COM_DATA[2] =0; COM_DATA[3] =0; COM_DATA[5] =0; COM_DATA[4] =w; //最后一位 XIE_RAM2(1,16,0,1); //显示当前A值 } delay(20) ; } delay(200) ; if(bei!=w) { QING_RAM2(); //清显示缓冲区RAM2内存 delay(10) ; IAP_CACHU (0x0A,0); //清空EEP 3扇区 IAP_XIE (w,0x0A,204) ; } } void set_IN_time(void) { unsigned char i,w,bei; w= IAP_DU (0x0c,204); bei=w; // if(w>0) // w=1; COM_DATA[0] =13; COM_DATA[1] =0; COM_DATA[2] =0; COM_DATA[3] =0; COM_DATA[5] =0; COM_DATA[4] =w; //最后一位 XIE_RAM2(1,16,0,1); //显示当前A值 for(i=0;i<100;i++) { if(jp(3)==1) { w++; COM_DATA[0] =13; COM_DATA[1] =0; COM_DATA[2] =0; COM_DATA[3] =0; COM_DATA[5] =0; COM_DATA[4] =w; //最后一位 XIE_RAM2(1,16,0,1); //显示当前A值 } else if(jp(2)==1) { w--; COM_DATA[0] =13; COM_DATA[1] =0; COM_DATA[2] =0; COM_DATA[3] =0; COM_DATA[5] =0; COM_DATA[4] =w; //最后一位 XIE_RAM2(1,16,0,1); //显示当前A值 } delay(20) ; } delay(200) ; QING_RAM2(); //清显示缓冲区RAM2内存 delay(10) ; IAP_CACHU (0x0c,0); //清空EEP 3扇区 IAP_XIE (w,0x0c,204) ; } unsigned char IN_j(void) { unsigned int i; if(in_b==0) { EXIT3 : WDT_CONTR = 0x3C; //狗;; if(IN_1==hl_b) { for(i=0;i<6000;i++) ; delay(IN_time); //延迟 if(IN_1!=hl_b) goto EXIT3; if(IN_1==hl_b) for(i=0;i<6000;i++) ; delay(IN_time); //开机延迟 if(IN_1!=hl_b) goto EXIT3; in_b=1; return 1; } } else { if(IN_1!=hl_b) { in_b=0; return 0; } } } void xianshi(unchar a0,unchar a1,unchar a2,unchar a3,unchar a4 ) { COM_DATA[1]=a0 ; COM_DATA[2]=a1 ; COM_DATA[3]=a2 ; COM_DATA[4]=a3; COM_DATA[5]=a4 ; COM_DATA[0]=16 ; XIE_RAM2(Zhi_h+1,H_ZHI[Zhi_h],JIAO_HAO_1[Zhi_h],JIAO_HAO_1[Zhi_h]); // XIE_RAM2(1,16,0,1); //显示当前A值 } /********************8位接收设置**********************/ void INSZ8(void) { SCON = 0x50; // 晶振18.432M PCON |=0x80; TMOD |= 0X20; TMOD &= 0XEF; TH1 = 0XF6; //9600 晶振18.432M TL1 = 0xf6; TR1=1; IE |= 0x90; // RE = 0; } // /*****************主程序区****************************/ void main(void) { unsigned char idata i,ab_ch; unsigned int idata time_f; unsigned char idata ucdata_B[3]; bit A_B,time_bit,ab_b; delay(1); //开机延迟 dingsi(); //开启显示扫描定时 zi=0; Zhi_ZHI=0; time_s=0; da_H=0;//行扫开始值 CHU_SHI(); //初始化 INSZ8(); //开启串口接收 18.432M-19200--------------- if(jp5S(3)==1) set_IN_HL() ; // 输入端高低电平有效位设置 if(jp5S(2)==1) set_IN_time() ; time_bit=0 ; //是否有数据需要保存标志位 A_B=0; //显示A/B组标志位 IN_HL= IAP_DU (0x0A,204); //读出输入端高低电平为有效位 IN_time= IAP_DU (0x0c,204); if(IN_time>200) { IN_time=5; IAP_CACHU (0x0c,0); //清空EEP 3扇区 IAP_XIE (IN_time,0x0c,204) ; } if(IN_HL>0) hl_b=0; else hl_b=1; in_b=1; //防止误动作 xianshi(10,11,16,16,16 ) ; //B delay(100) ; i=IAP_DU (0x04,200); if(i>99) ucdata_B[0]=0; else ucdata_B[0]= i ; i=IAP_DU (0x04,201); if(i>99) ucdata_B[1]=0; else ucdata_B[1]= i ; i=IAP_DU (0x04,202); if(i>99) ucdata_B[2]=0; else ucdata_B[2]= i ; xianshi(ucdata_B[2]%10,ucdata_B[1]/10,ucdata_B[1]%10,ucdata_B[0]/10,ucdata_B[0]%10 ) ; ////显示当前值B /* delay(200) ; xianshi(10,16,16,16,16 ) ; //A delay(200) ; i=IAP_DU (0x03,200); if(i>99) ucdata[0]=0; else ucdata[0]= i ; i=IAP_DU (0x03,201); if(i>99) ucdata[1]=0; else ucdata[1]= i ; i=IAP_DU (0x03,202); if(i>99) ucdata[2]=0; else ucdata[2]= i ; */ // xianshi(ucdata[2]%10,ucdata[1]/10,ucdata[1]%10,ucdata[0]/10,ucdata[0]%10 ) ; //显示当前A值 while(1) { open: WDT_CONTR = 0x3C; //狗; delay(1) ; i=1; for(i=0;i<3;i++); if(IN_j()==1) //有数据输入 { if(ucdata_B[0]>=99) { ucdata_B[0]=0; if(ucdata_B[1]>=99) { ucdata_B[1]=0; if(ucdata_B[2]>=99) ucdata_B[2]=0; else ucdata_B[2]++; } else ucdata_B[1]++; } else ucdata_B[0]++; xianshi(ucdata_B[2]%10,ucdata_B[1]/10,ucdata_B[1]%10,ucdata_B[0]/10,ucdata_B[0]%10 ) ; ////显示当前值B time_f=0; time_s=0; time_bit=1; ab_b=0; } if(time_s>60000&&time_bit) { time_f++; time_s=0; if(time_f>5) // { time_bit=0; time_f=0; chunchu_A(ucdata_B[0],ucdata_B[1],ucdata_B[2],0x04); } } if(jp5S(3)==1)//按纽3显示B组数据 { xianshi(11,ucdata_B[1]/10,ucdata_B[1]%10,ucdata_B[0]/10,ucdata_B[0]%10 ) ; ////显示当前值B ab_b=1; ab_ch=0; } else { if(ab_b) { ab_ch++; if(ab_ch>100) { chunchu_A(ucdata_B[0],ucdata_B[1],ucdata_B[2],0x04); xianshi(ucdata_B[2]%10,ucdata_B[1]/10,ucdata_B[1]%10,ucdata_B[0]/10,ucdata_B[0]%10 ) ; ////显示当前值B ab_b=0; } } } if(jp5S(2)==1)//按纽2清除A/B组数据 { ucdata_B[0]=0; ucdata_B[1]=0; ucdata_B[2]=0; QING_RAM2(); //清显示缓冲区RAM2内存 delay(10) ; chunchu_A(ucdata_B[0],ucdata_B[1],ucdata_B[2],0x04); xianshi(ucdata_B[2]%10,ucdata_B[1]/10,ucdata_B[1]%10,ucdata_B[0]/10,ucdata_B[0]%10 ) ; ////显示当前值B } goto open; } } /* 程序完成时间: */ |
如果需要,我几年前有个LED计算器的程序可以传上来,你看看 |
你这个板子是老板子了,如是你能显示图1的话,说明你的驱动应当是OK的,我没细看你和程序 |
你第一张图已经说是板子是好的,程序问题 |
就是不明白为什么有几行会不亮? 用了几个程序都是这样 |
显示不全,就是不知道原因 |
先开一段RAM做显示缓存,一行一行的扫,一行数据全部发完再锁存, |
要看你用的什么型号的片子,可以考虑用定时器中断扫描 |
xdata struct j_RAM // 显示缓存 { U16 j_ram_Lie[PIN_ZI]; //开显示缓冲区 }j_ram_Hang[16]; |
以前的程序,很多是对你没用的,取了一段 |
for (k=0;k<lieshu;k++) //12 lieshu { da_k=j_ram_Hang[da_H].j_ram_Lie[k] ; for (i=0;i<16;i++) { R1_DAT=!(da_k&0x8000); CK_CLK = 1; _nop_(); CK_CLK = 0; da_k<<=1; } } |
想弄好16x64,在弄32x64这个大板 |
用这个程序驱动,显示不全 |
for(j=0;j<17;j++)应为for(j=0;j<16;j++) |
把程序附上 #include<reg52.h> #define uchar unsigned char #define uint unsigned int #define hang P1 //行扫描接在P1口 sbit g1=P0^0; //使能端OE sbit ds=P0^1; //红色数据 sbit clk=P0^3; //时钟信号 sbit stcp=P0^2; //锁存信号 sbit mr=P0^4; // uint counter; uchar flag; uchar code display[ ]={ /*-- 文字: 好 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x10,0x00,0x11,0xFC,0x10,0x08,0x10,0x10,0xFC,0x20,0x24,0x20,0x24,0x20,0x27,0xFE, 0x44,0x20,0x64,0x20,0x18,0x20,0x08,0x20,0x14,0x20,0x26,0x20,0x44,0xA0,0x80,0x40, /*-- 文字: 好 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x10,0x00,0x11,0xFC,0x10,0x08,0x10,0x10,0xFC,0x20,0x24,0x20,0x24,0x20,0x27,0xFE, 0x44,0x20,0x64,0x20,0x18,0x20,0x08,0x20,0x14,0x20,0x26,0x20,0x44,0xA0,0x80,0x40, /*-- 文字: 学 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x01,0x08,0x10,0x8C,0x0C,0xC8,0x08,0x90,0x7F,0xFE,0x40,0x04,0x8F,0xE8,0x00,0x40, 0x00,0x80,0x7F,0xFE,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x02,0x80,0x01,0x00, /*-- 文字: 习 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x00,0x00,0x3F,0xFC,0x00,0x04,0x08,0x04,0x04,0x04,0x03,0x04,0x01,0x14,0x00,0x64, 0x01,0x84,0x06,0x04,0x38,0x04,0x10,0x04,0x00,0x04,0x00,0x24,0x00,0x14,0x00,0x00, /*-- 文字: 天 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x00,0x00,0x3F,0xFC,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x7F,0xFE,0x00,0x80, 0x00,0x80,0x01,0x40,0x02,0x40,0x04,0x20,0x18,0x10,0x70,0x08,0x20,0x04,0x00,0x02, /*-- 文字: 天 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x00,0x00,0x3F,0xFC,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x7F,0xFE,0x00,0x80, 0x00,0x80,0x01,0x40,0x02,0x40,0x04,0x20,0x18,0x10,0x70,0x08,0x20,0x04,0x00,0x02, /*-- 文字: 向 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x00,0x40,0x00,0x20,0x3F,0xFC,0x20,0x04,0x20,0x04,0x27,0xE4,0x24,0x24,0x24,0x24, 0x24,0x24,0x24,0x24,0x27,0xE4,0x24,0x24,0x20,0x04,0x28,0x04,0x10,0x04,0x00,0x00, /*-- 文字: 上 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x00,0x00,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x1F,0x80,0x00,0x80, 0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x20,0x80,0x7F,0xFE,0x00,0x00, }; void write_595(uchar shuju) //向595写一个字节的数据 { uchar i; for(i=0;i<8;i++) { ds=(~shuju)&0x01; clk=1; clk=0; shuju=shuju>>1; } } void delay_ms(uchar x) //x=50演延时10ms { uchar a,b; for(a=x;a>0;a--) for(b=200;b>0;b--); } void main() //主函数 { while(1) { uchar i,j; for(i=100;i>0;i--) //显示时间 for(j=0;j<17;j++) { write_595(display[j*2+4*32+1]); write_595(display[j*2+4*32]); write_595(display[j*2+5*32+1]); write_595(display[j*2+5*32]); write_595(display[j*2+6*32+1]); write_595(display[j*2+6*32]); write_595(display[j*2+7*32+1]); write_595(display[j*2+7*32]); g1=0; //154使能 stcp=1; stcp=0; hang=j; } |
xing1234 发表于 2014-11-11 16:23 一次将4个字的数据发完,就会有几行不亮,字显示不全。 |
你一次将4个字的数据发完再锁存就OK了 |