找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 19909|回复: 49
打印 上一主题 下一主题
收起左侧

基于单片机的64*16LED点阵电子显示屏设计 pcb图+原理图+源程序

  [复制链接]
跳转到指定楼层
楼主
这是一个51单片机的64*16LED点阵电子显示屏设计包含原理图+pcb图+源程序


压缩包全部的资料下载:
基于单片机的LED电子显示屏的设计.rar (8.36 MB, 下载次数: 737)

下面分享一下部分源程序:
  1. /*64*16点阵屏的显示点阵屏的显示*/

  2. #include <reg52.h>
  3. #include <intrins.h>
  4. #include <stdio.h>
  5. #define ulong  unsigned long
  6. #define uchar unsigned char
  7. #define uint unsigned int
  8. #define DATAOUT P2           //指定P2口做为输出
  9. sfr ISP_CONTR = 0xe7;
  10. sbit DATA=DATAOUT^0;        //列数据输出位        
  11. sbit SCLH=DATAOUT^1;        //列扫描时钟位
  12. sbit SCLT=DATAOUT^2;        //列数据锁存位
  13. sbit AB=DATAOUT^4;                //行数据输出位
  14. sbit SCK=DATAOUT^5;                //行扫描时钟位        
  15. sbit key1 = P3^2;                //键盘位定义
  16. sbit key2 = P0^1;
  17. sbit key3 = P0^2;
  18. sbit key4 = P3^3;
  19. unsigned int idata numyear;
  20. unsigned char idata numt0,num,numf,nums,numday,nummonth;   //全局变量定义numt0 为定时器0计数,num 为时间秒计数,numf 分钟计数,nums 小时计数
  21. unsigned char idata lhj[128];      //128字节RAM做为64*16点阵屏显示缓存
  22. void display();                   //做为点阵扫描函数,将显示缓存的数据输出到点阵屏
  23. void display2();
  24. void displayS(unsigned int timer);//指定时间扫描显示
  25. void displayS2(unsigned int );
  26. void displaymove(unsigned char *lp,unsigned char c,unsigned char timer);        //显示汉字内容的移动效果,LP指向要显示第一个字的首地址,C表示显示字的个数,

  27. void displaymove2(unsigned char *,unsigned char ,unsigned char );                //timer是移动的速度
  28. void displaymovetb(unsigned char din,unsigned char *lp,unsigned char c,unsigned char timer);
  29. void displaymovetb2(unsigned char ,unsigned char *,unsigned char ,unsigned char);

  30. void init();                     //初始化函数
  31. void displayshijian();                         //时间显示函数//上下移动内容,din:1为向下,0为向上,
  32. void displayshijian2();                    //lp指向要移入的内容表示有几个汉字要移,timer为移动速度                                                                                                                                                                                                
  33. //void delay(unsigned int z);//延时子函数

  34. /******************  字模  *************************/

  35. code unsigned char DIAN[32]={
  36.         0x00,0x00,0x00,0x00,0x1F,0xF8,0x11,0x10,
  37.         0x11,0x10,0x11,0x10,0x11,0x10,0xFF,0xFE,
  38.         0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
  39.         0x1F,0xF9,0x00,0x01,0x00,0x0F,0x00,0x00,
  40.                                                           };                                                 //电

  41. code unsigned char QI[32]={
  42.         0x04,0x00,0x08,0x00,0x32,0x00,0xE2,0x00,
  43.         0x2A,0x00,0x2A,0x00,0x2A,0x00,0x2A,0x00,
  44.         0x2A,0x00,0x2A,0x00,0x2A,0x00,0x2B,0xF0,
  45.         0x20,0x0C,0x20,0x02,0x00,0x0F,0x00,0x00,
  46.                                                     };                                            //气

  47. code unsigned char GONG[32]={
  48.         0x00,0x04,0x20,0x04,0x20,0x04,0x20,0x04,
  49.         0x20,0x04,0x20,0x04,0x20,0x04,0x3F,0xFC,
  50.         0x20,0x04,0x20,0x04,0x20,0x04,0x20,0x04,
  51.         0x20,0x04,0x20,0x04,0x00,0x04,0x00,0x00,
  52.                                                           };                                                  //工

  53. code unsigned char CHENG[32]={
  54.         0x22,0x10,0x22,0x60,0x23,0x80,0x7F,0xFF,
  55.         0xC2,0x80,0x42,0x60,0x00,0x02,0x7A,0x92,
  56.         0x42,0x92,0x42,0x92,0x42,0xFE,0x42,0x92,
  57.         0x42,0x92,0x7A,0x92,0x00,0x82,0x00,0x00,
  58.                                                         };                                                  //程

  59. code unsigned char LAO[32]={
  60.     0x04,0x08,0x04,0x10,0x24,0x20,0x24,0x40,
  61.         0x24,0xFC,0x24,0xA2,0xFD,0x22,0x26,0x22,
  62.         0x24,0x42,0x2C,0x42,0x14,0x42,0x24,0x82,
  63.         0x44,0x1E,0x04,0x00,0x04,0x00,0x00,0x00,
  64.                                                         };                                             //老

  65. code unsigned char SHI1[32]={
  66.          0x00,0x00,0x3F,0xE1,0x00,0x02,0x00,0x0C,
  67.         0xFF,0xF0,0x00,0x00,0x40,0x00,0x27,0xF8,
  68.         0x24,0x00,0x24,0x00,0x7F,0xFF,0x24,0x10,
  69.         0x24,0x08,0x27,0xF0,0x20,0x00,0x00,0x00,
  70.                                                         };                                           //师

  71. code unsigned char MEN[32]={
  72.         0x00,0x80,0x01,0x00,0x06,0x00,0x1F,0xFF,
  73.         0xE0,0x00,0x00,0x00,0x1F,0xFF,0x80,0x00,
  74.         0x60,0x00,0x00,0x00,0x20,0x00,0x20,0x02,
  75.         0x20,0x01,0x3F,0xFE,0x00,0x00,0x00,0x00,
  76.                                                         };                                          //们

  77. code unsigned char HAO[32]={
  78.         0x08,0x02,0x08,0x44,0x0F,0xA8,0xF8,0x10,
  79.         0x08,0x68,0x0F,0x86,0x00,0x00,0x01,0x00,
  80.         0x41,0x02,0x41,0x01,0x47,0xFE,0x49,0x00,
  81.         0x51,0x00,0x61,0x00,0x01,0x00,0x00,0x00,
  82.                                                         };                                           //好

  83. code unsigned char BEI[32] ={
  84.         0x00,0x04,0x04,0x06,0x04,0x04,0x04,0x08,
  85.         0x04,0x08,0xFF,0xFF,0x00,0x00,0x00,0x00,
  86.         0x00,0x00,0xFF,0xFC,0x02,0x02,0x04,0x02,
  87.         0x08,0x02,0x10,0x02,0x00,0x1E,0x00,0x00,

  88.                                                           };                                           //北

  89. code unsigned char JING[32] = {
  90.         0x20,0x00,0x20,0x02,0x20,0x04,0x27,0xD8,
  91.         0x24,0x40,0x24,0x42,0xA4,0x41,0x64,0x7E,
  92.         0x24,0x40,0x24,0x40,0x24,0x40,0x27,0xD0,
  93.         0x20,0x08,0x20,0x06,0x20,0x00,0x00,0x00,
  94.                                                           };                                           //京

  95. code unsigned char SHI[32] = {
  96.         0x00,0x00,0x3F,0xFC,0x21,0x08,0x21,0x08,
  97.         0x21,0x08,0x3F,0xFC,0x00,0x00,0x08,0x00,
  98.         0x08,0x80,0x08,0x60,0x08,0x02,0x08,0x01,
  99.         0xFF,0xFE,0x08,0x00,0x08,0x00,0x00,0x00,
  100.                                                           };                                        //时
  101.                                                                   
  102. code unsigned char JIAN[32] = {
  103.         0x00,0x00,0x1F,0xFF,0x80,0x00,0x60,0x00,
  104.         0x00,0x00,0x0F,0xF8,0x48,0x88,0x48,0x88,
  105.         0x48,0x88,0x4F,0xF8,0x40,0x00,0x40,0x02,
  106.         0x40,0x01,0x7F,0xFE,0x00,0x00,0x00,0x00,

  107.                                                           };                                        //间

  108. code unsigned char XL[32]={
  109.                 0x00,0x00,0x07,0xc0,0x18,0x30,0x20,0x0C,
  110.                 0x40,0xC4,0x8C,0x62,0x8C,0x32,0x80,0x12,
  111.                 0x80,0x12,0x80,0x12,0x8C,0x32,0x4C,0x64,
  112.                 0x40,0xC4,0x20,0x08,0x18,0x60,0x07,0xC0,
  113.                                                         };                                  //笑脸

  114. code unsigned char ANZHUO[32]={
  115.                 0x00,0x00,0x00,0x00,0x03,0xE0,0x03,0xE0,
  116.                 0x00,0x00,0x9B,0xF0,0x3B,0xFE,0x6B,0xFE,
  117.                 0x7B,0xF0,0x6B,0xFE,0x3B,0xFE,0x9B,0xF0,
  118.                 0x00,0x00,0x03,0xE0,0x03,0xE0,0x00,0x00,
  119.                                                           };                                    //安卓

  120. code unsigned char HOU[32]={
  121.          0x00,0x01,0x00,0x02,0x03,0xfC,0x02,0x30,
  122.          0x02,0x10,0x02,0x18,0xFE,0x16,0x12,0x10,
  123.          0x12,0x18,0x12,0x16,0x12,0x10,0x13,0xf0,
  124.          0x10,0x08,0x10,0x07,0x00,0x00,0x00,0x00,
  125.                                                           };                                          //“点”

  126. code unsigned char MIN[32]={
  127.          0x01,0x00,0x02,0x01,0x04,0x02,0x09,0x04,
  128.          0x11,0x18,0x61,0xE0,0x01,0x00,0x01,0x02,
  129.          0x01,0x01,0xC1,0x02,0x31,0xFC,0x08,0x00,
  130.          0x04,0x00,0x02,0x00,0x01,0x00,0x00,0x00,
  131.                                                           };                                          //“分”

  132. code unsigned char el[32]={
  133.          0x00,0x00,0x07,0x0C,0x10,0x14,0x10,0x24,
  134.          0x10,0x44,0x11,0x84,0x0e,0x0c,0x00,0x00,
  135.          0x00,0x00,0x07,0xe0,0x08,0x10,0x10,0x08,
  136.          0x10,0x08,0x08,0x10,0x07,0xe0,0x00,0x00,};   //20

  137. code unsigned char yw[32]={
  138.          0x00,0x00,0x08,0x04,0x08,0x04,0x1f,0xfc,
  139.          0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,
  140.          0x00,0x00,0x3e,0x02,0x22,0x02,0x22,0x02,
  141.          0x22,0x04,0x22,0x08,0x21,0xf0,0x00,0x00,};   //15

  142. code unsigned char NIAN2[32]={
  143.      0x00,0x20,0x04,0x20,0x18,0x20,0xE3,0xE0,
  144.          0x22,0x20,0x22,0x20,0x22,0x20,0x22,0x20,
  145.          0x3F,0xFF,0x22,0x20,0x22,0x20,0x22,0x20,
  146.          0x22,0x20,0x20,0x20,0x00,0x20,0x00,0x00,
  147.                                                           };                                   //年

  148. code unsigned char nop[32]={
  149.      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  150.          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  151.      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  152.          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  153.                                                           };  
  154. code unsigned char lw[32]={
  155.          0x00,0x00,0x07,0xe0,0x08,0x10,0x10,0x08,
  156.          0x10,0x08,0x08,0x10,0x07,0xe0,0x00,0x00,
  157.          0x00,0x00,0x3e,0x02,0x22,0x02,0x22,0x02,
  158.          0x22,0x04,0x22,0x08,0x21,0xf0,0x00,0x00,};         //05


  159. code unsigned char YUE[32]={
  160.          0x00,0x01,0x00,0x02,0x00,0x0C,0x3F,0xF0,
  161.          0x22,0x40,0x22,0x40,0x22,0x40,0x22,0x40,
  162.          0x22,0x40,0x22,0x40,0x22,0x42,0x22,0x41,
  163.          0x3F,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,
  164.                                                         };                                          //月

  165. code unsigned char shl[32]={
  166.          0x00,0x00,0x08,0x04,0x08,0x04,0x1f,0xfc,
  167.          0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,
  168.          0x00,0x00,0x0e,0xf8,0x10,0x84,0x20,0x84,
  169.          0x20,0x84,0x20,0x84,0x20,0x78,0x00,0x00,};        //16
  170. code unsigned char RI2[32]={
  171.          0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xFF,
  172.          0x41,0x02,0x41,0x02,0x41,0x02,0x41,0x02,
  173.          0x41,0x02,0x41,0x02,0x41,0x02,0x7F,0xFF,
  174.          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

  175.                                                         };                                           //日
  176. code unsigned char xie[32]={
  177.          0x02,0x00,0x42,0x00,0x33,0xFC,0x00,0x08,
  178.          0x00,0x54,0x3F,0xC8,0x6A,0x52,0xAA,0x61,
  179.          0x3F,0xFE,0x01,0x00,0x08,0xC2,0x08,0x01,
  180.          0xFF,0xFE,0x08,0x00,0x08,0x00,0x00,0x00,
  181.                                                         };
  182. code unsigned char xie1[32]={
  183.          0x02,0x00,0x42,0x00,0x33,0xFC,0x00,0x08,
  184.          0x00,0x54,0x3F,0xC8,0x6A,0x52,0xAA,0x61,
  185.          0x3F,0xFE,0x01,0x00,0x08,0xC2,0x08,0x01,
  186.          0xFF,0xFE,0x08,0x00,0x08,0x00,0x00,0x00,
  187.                                                         };
  188. code unsigned char LAO1[32]={
  189.     0x04,0x08,0x04,0x10,0x24,0x20,0x24,0x40,
  190.         0x24,0xFC,0x24,0xA2,0xFD,0x22,0x26,0x22,
  191.         0x24,0x42,0x2C,0x42,0x14,0x42,0x24,0x82,
  192.         0x44,0x1E,0x04,0x00,0x04,0x00,0x00,0x00,
  193.                                                         };                                             //老

  194. code unsigned char SHI2[32]={
  195.          0x00,0x00,0x3F,0xE1,0x00,0x02,0x00,0x0C,
  196.         0xFF,0xF0,0x00,0x00,0x00,0x00,0x2f,0xF8,
  197.         0x28,0x00,0x28,0x00,0x3F,0xFF,0x28,0x10,
  198.         0x28,0x08,0x2f,0xF0,0x20,0x00,0x00,0x00,
  199.                                                         };                                           //师
  200. //时数据
  201. code unsigned char c[3][16]={
  202. ///*--  文字:  0  --*//*--  楷体_GB231212;  此字体下对应的点阵为:宽x高=8x16   --*/
  203. {0x00,0x00,0x07,0xe0,0x08,0x10,0x10,0x08,0x10,0x08,0x08,0x10,0x07,0xe0,0x00,0x00,},
  204. {///*--  文字:  1  --*/
  205. 0x00,0x00,0x08,0x04,0x08,0x04,0x1f,0xfc,0x00,0x04,0x00,0x04,0x00,0x07,0x10,0x10,},
  206. {///*--  文字:  2  --*/
  207. 0x00,0x00,0x07,0x0C,0x10,0x14,0x10,0x24,0x10,0x44,0x11,0x84,0x0e,0x0c,0x00,0x00,}
  208. };

  209. code unsigned char d[10][16]={
  210. {///*--  文字:  0  --*/
  211. 0x00,0x00,0x07,0xe0,0x08,0x10,0x10,0x08,0x10,0x08,0x08,0x10,0x07,0xe0,0x00,0x00,
  212. },
  213. {///*--  文字:  1  --*/
  214. 0x00,0x00,0x00,0x10,0x70,0x10,0x10,0x10,
  215. 0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00,
  216. },
  217. {///*--  文字:  2  --*/
  218. 0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x04,0x04,0x08,0x10,0x20,0x42,0x7E,0x00,0x00,
  219. },
  220. {///*--  文字:  3  --*/
  221. 0x00,0x00,0x00,0x3C,0x42,0x42,0x04,0x18,0x04,0x02,0x02,0x42,0x44,0x38,0x00,0x00,
  222. },
  223. {///*--  文字:  4  --*/
  224. 0x00,0x00,0x00,0x04,0x0C,0x14,0x24,0x24,0x44,0x44,0x7E,0x04,0x04,0x1E,0x00,0x00,
  225. },
  226. {///*--  文字:  5  --*/
  227. 0x00,0x00,0x00,0x7E,0x40,0x40,0x40,0x58,0x64,0x02,0x02,0x42,0x44,0x38,0x00,0x00,
  228. },
  229. {///*--  文字:  6  --*/
  230. 0x00,0x00,0x00,0x1C,0x24,0x40,0x40,0x58,0x64,0x42,0x42,0x42,0x24,0x18,0x00,0x00,
  231. },
  232. {///*--  文字:  7  --*/
  233. 0x00,0x00,0x00,0x7E,0x44,0x44,0x08,0x08,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,
  234. },
  235. {///*--  文字:  8  --*/
  236. 0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x24,0x18,0x24,0x42,0x42,0x42,0x3C,0x00,0x00,
  237. },
  238. {///*--  文字:  9  --*/
  239. 0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x26,0x1A,0x02,0x02,0x24,0x38,0x00,0x00,}
  240. };

  241. //分数据
  242. code unsigned char b[10][16]={
  243. {///*--  文字:  0  --*/
  244. 0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x24,0x18,0x00,0x00,
  245. },
  246. {///*--  文字:  1  --*/
  247. 0x00,0x00,0x00,0x10,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00,
  248. },
  249. {///*--  文字:  2  --*/
  250. 0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x04,0x04,0x08,0x10,0x20,0x42,0x7E,0x00,0x00,
  251. },
  252. {///*--  文字:  3  --*/
  253. 0x00,0x00,0x00,0x3C,0x42,0x42,0x04,0x18,0x04,0x02,0x02,0x42,0x44,0x38,0x00,0x00,
  254. },
  255. {///*--  文字:  4  --*/
  256. 0x00,0x00,0x00,0x04,0x0C,0x14,0x24,0x24,0x44,0x44,0x7E,0x04,0x04,0x1E,0x00,0x00,
  257. },
  258. {///*--  文字:  5  --*/
  259. 0x00,0x00,0x00,0x7E,0x40,0x40,0x40,0x58,0x64,0x02,0x02,0x42,0x44,0x38,0x00,0x00,
  260. },
  261. {///*--  文字:  6  --*/
  262. 0x00,0x00,0x00,0x1C,0x24,0x40,0x40,0x58,0x64,0x42,0x42,0x42,0x24,0x18,0x00,0x00,
  263. },
  264. {///*--  文字:  7  --*/
  265. 0x00,0x00,0x00,0x7E,0x44,0x44,0x08,0x08,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,
  266. },
  267. {///*--  文字:  8  --*/
  268. 0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x24,0x18,0x24,0x42,0x42,0x42,0x3C,0x00,0x00,
  269. },
  270. {///*--  文字:  9  --*/
  271. 0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x26,0x1A,0x02,0x02,0x24,0x38,0x00,0x00,
  272. }
  273. };


  274. code unsigned char a[6][16]={
  275. {///*--  文字:  0  --*/
  276. 0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x24,0x18,0x00,0x00,
  277. },
  278. {///*--  文字:  1  --*/
  279. 0x00,0x00,0x00,0x10,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00,
  280. },
  281. {///*--  文字:  2  --*/
  282. 0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x04,0x04,0x08,0x10,0x20,0x42,0x7E,0x00,0x00,
  283. },
  284. {///*--  文字:  3  --*/
  285. 0x00,0x00,0x00,0x3C,0x42,0x42,0x04,0x18,0x04,0x02,0x02,0x42,0x44,0x38,0x00,0x00,
  286. },
  287. {///*--  文字:  4  --*/
  288. 0x00,0x00,0x00,0x04,0x0C,0x14,0x24,0x24,0x44,0x44,0x7E,0x04,0x04,0x1E,0x00,0x00,
  289. },
  290. {///*--  文字:  5  --*/
  291. 0x00,0x00,0x00,0x7E,0x40,0x40,0x40,0x58,0x64,0x02,0x02,0x42,0x44,0x38,0x00,0x00,
  292. }
  293. };

  294. void init()                                         //初始化程序
  295. {
  296.         TMOD = 0x01;                               //  定时器0为工作方式1
  297.         TH0 = (65536-50000)/256;        //定时50mS
  298.         TL0 = (65536-50000)%256;
  299.         EA = 1;                                       //开总中断
  300.         ET0 = 1;                                   //开定时器0中断
  301.         EX0 = 1;                                   //开外部中断0
  302.         EX1 = 1;                                   //开外部中断1
  303.         IT0 = 0;                                   //设置外部中断0的中断方式为0 低电平触发
  304.         IT1 = 0;
  305.         TR0 = 1;                                   //启动定时器0

  306.         num = 0;
  307.         nums = 12;
  308.         numf = 30;
  309.         numyear = 2015;
  310.         nummonth = 5;
  311.         numday = 15;
  312. }
  313. void displayshijian()                 //显示时间函数
  314. {
  315.                 unsigned char i,j,p1,k1,p2,k2;
  316.                 p1 = nums/10;
  317.                 k1 = nums%10;          //小时数据
  318.                 p2 = numf/10;
  319.                 k2 = numf%10;          //分钟数据
  320.                
  321.                 for(i=0;i<128;i++)         //显示缓存清空        
  322.                 {        
  323.                         lhj[i]=0;
  324.                 }

  325.                 for(i=0,j=0;i<128;)               
  326.                 {        
  327.                         lhj[i]=c[p1][j];
  328.                         lhj[i+1]=d[k1][j];
  329.         
  330.                           i=i+8;
  331.                         j=j+1;
  332.                 }
  333.         
  334.                 for(i=2,j=0;i<128;)               
  335.                 {        
  336.                         lhj[i]=HOU[j];
  337.                         lhj[i+1]=HOU[j+1];
  338.         
  339.                           i=i+8;
  340.                         j=j+2;
  341.                 }
  342.         
  343.                 for(i=4,j=0;i<128;)               
  344.                 {        
  345.                         lhj[i]=a[p2][j];
  346.                         lhj[i+1]=b[k2][j];
  347.         
  348.                           i=i+8;
  349.                         j=j+1;
  350.                 }
  351.                
  352.                 for(i=6,j=0;i<128;)               
  353.                 {        
  354.                         lhj[i]=MIN[j];
  355.                         lhj[i+1]=MIN[j+1];
  356.         
  357.                           i=i+8;
  358.                         j=j+2;
  359.                 }
  360.                 displayS(1);         



  361. }

  362. void displayshijian2()                 //显示时间函数
  363. {
  364.                
  365.                 unsigned char i,j,p1,k1,p2,k2;
  366.                 p1 = nums/10;
  367.                 k1 = nums%10;          //小时数据
  368.                 p2 = numf/10;
  369.                 k2 = numf%10;          //分钟数据
  370.                
  371.                 for(i=0;i<128;i++)         //显示缓存清空        
  372.                 {        
  373.                         lhj[i]=0;
  374.                 }

  375.                 for(i=0,j=0;i<128;)               
  376.                 {        
  377.                         lhj[i]=c[p1][j];
  378.                         lhj[i+1]=d[k1][j];
  379.         
  380.                           i=i+8;
  381.                         j=j+1;
  382.                 }
  383.         
  384.                 for(i=2,j=0;i<128;)               
  385.                 {        
  386.                         lhj[i]=HOU[j];
  387.                         lhj[i+1]=HOU[j+1];
  388.         
  389.                           i=i+8;
  390.                         j=j+2;
  391.                 }
  392.         
  393.                 for(i=4,j=0;i<128;)               
  394.                 {        
  395.                         lhj[i]=a[p2][j];
  396.                         lhj[i+1]=b[k2][j];
  397.         
  398.                           i=i+8;
  399.                         j=j+1;
  400.                 }
  401.                
  402.                 for(i=6,j=0;i<128;)               
  403.                 {        
  404.                         lhj[i]=MIN[j];
  405.                         lhj[i+1]=MIN[j+1];
  406.         
  407.                           i=i+8;
  408.                         j=j+2;
  409.                 }
  410.                 displayS(1);         
  411. }


  412. void displaynyr()                                //年月日显示程序
  413. {        
  414.                 unsigned char i,j,n1,n2,n3,n4,p1,k1,p2,k2;         //n年 p1k1月 p2k2日
  415.                 n1 = numyear/1000;
  416.                 n2 = (numyear%1000)/100;
  417.                 n3 = (numyear%100)/10;
  418.                 n4 = numyear%10;
  419.                 p1 = nummonth/10;
  420.                 k1 = nummonth%10;          //月数据
  421.                 p2 = numday/10;
  422.                 k2 = numday%10;          //日数据

  423.                 for(i=0;i<128;i++)         //显示缓存清空        
  424.                 {        
  425.                         lhj[i]=0;
  426.                 }

  427.                 for(i=0,j=0;i<128;)               
  428.                 {        
  429.                         lhj[i]=d[n1][j];
  430.                         lhj[i+1]=d[n2][j];
  431.         
  432.                           i=i+8;
  433.                         j=j+1;
  434.                 }
  435.                 for(i=2,j=0;i<128;)               
  436.                 {        
  437.                         lhj[i]=d[n3][j];
  438.                         lhj[i+1]=d[n4][j];
  439.         
  440.                           i=i+8;
  441.                         j=j+1;
  442.                 }
  443.                 for(i=4,j=0;i<128;)               
  444.                 {        
  445.                         lhj[i]=NIAN2[j];
  446.                         lhj[i+1]=NIAN2[j+1];
  447.         
  448.                           i=i+8;
  449.                         j=j+2;
  450.                 }
  451.                 displayS(2);
  452.         displaymovetb(1,0,4,2);

  453.                 for(i=0,j=0;i<128;)               
  454.                 {        
  455.                         lhj[i]=d[p1][j];
  456.                         lhj[i+1]=d[k1][j];
  457.         
  458.                           i=i+8;
  459.                         j=j+1;
  460.                 }
  461.                 for(i=2,j=0;i<128;)               
  462.                 {        
  463.                         lhj[i]=YUE[j];
  464.                         lhj[i+1]=YUE[j+1];
  465.         
  466.                           i=i+8;
  467.                         j=j+2;
  468.                 }
  469.                 for(i=4,j=0;i<128;)               
  470.                 {        
  471.                         lhj[i]=d[p2][j];
  472.                         lhj[i+1]=d[k2][j];
  473.         
  474.                           i=i+8;
  475.                         j=j+1;
  476.                 }
  477.                 for(i=6,j=0;i<128;)               
  478.                 {        
  479.                         lhj[i]=RI2[j];
  480.                         lhj[i+1]=RI2[j+1];
  481.         
  482.                           i=i+8;
  483.                         j=j+2;
  484.                 }
  485.            displayS(3);
  486.        displaymovetb(1,0,4,1);
  487. }

  488. void displaynyr2()
  489. {        
  490.                 unsigned char i,j,p1,k1,p2,k2;         //n年 p1k1月 p2k2日
  491.                 p1 = nummonth/10;
  492.                 k1 = nummonth%10;          //月数据
  493.                 p2 = numday/10;
  494.                 k2 = numday%10;          //日数据

  495.                 for(i=0,j=0;i<128;)               
  496.                 {        
  497.                         lhj[i]=d[p1][j];
  498.                         lhj[i+1]=d[k1][j];
  499.         
  500.                           i=i+8;
  501.                         j=j+1;
  502.                 }
  503.                 for(i=2,j=0;i<128;)               
  504.                 {        
  505.                         lhj[i]=YUE[j];
  506.                         lhj[i+1]=YUE[j+1];
  507.         
  508.                           i=i+8;
  509.                         j=j+2;
  510.                 }
  511.                 for(i=4,j=0;i<128;)               
  512.                 {        
  513.                         lhj[i]=d[p2][j];
  514.                         lhj[i+1]=d[k2][j];
  515.         
  516.                           i=i+8;
  517.                         j=j+1;
  518.                 }
  519.                 for(i=6,j=0;i<128;)               
  520.                 {        
  521.                         lhj[i]=RI2[j];
  522.                         lhj[i+1]=RI2[j+1];
  523.         
  524.                           i=i+8;
  525.                         j=j+2;
  526.                 }
  527.            displayS2(1);
  528. }



  529. void extern1() interrupt 2                 //外部中断1
  530. {
  531.         displaynyr2();
  532.          if((key2 == 0)&&(key3 ==0))
  533.                  ISP_CONTR = 0x20;
  534.          
  535.          if(key3 == 0)  
  536.         {        
  537.                 if(key3 == 0)
  538.                 {
  539.                         numday++;
  540.                         if(numday > 31)
  541.                           numday = 1;
  542.                  }
  543.         }

  544.         if(key2 == 0)  
  545.         {        
  546.                 if(key2 == 0)
  547.                 {
  548.                         nummonth++;
  549.                         if(nummonth > 12)
  550.                                 nummonth = 1;
  551.                  }
  552.         }

  553.         key4 = 1;

  554. }        

  555. void extern0() interrupt 0                 //外部中断0
  556. {        

  557.                 displayshijian2();
  558.                 if(key2 == 0)                     //key2按键扫描,按下则 小时nums加1
  559.                 {        
  560.                         if(key2 == 0)
  561.                         {
  562.                                 nums++;
  563.                                 if(nums > 23)
  564.                                         nums =0;
  565.                          }
  566.                 }
  567.                 if(key3 == 0)                         //key3按键扫描,按下则 分钟numf加1
  568.                 {
  569.                         if(key3 == 0)
  570.                         {
  571.                                 numf++;
  572.                                 if(numf > 59)
  573.                                         numf =0;               
  574.                         }
  575.                 }
  576.         key1 = 1;                   //P3.2口赋高电平 防止下次重复进入中断        

  577. }
  578.         

  579. void T0timer() interrupt 1                   //定时器0中断
  580. {
  581.         TH0 = (65536-50000)/256;
  582.         TL0 = (65536-50000)%256;
  583.         numt0++;
  584.         if(numt0 >= 40)                //24M hz40次为一秒
  585.         {
  586.                 numt0 = 0;
  587.                 num++;
  588.                 if(num > 59)
  589.                 {        num = 0;
  590.                         numf++;
  591.                 }
  592.         }
  593. }

  594. void displaytu_an()
  595. {
  596.          unsigned char i,j;
  597.          for(i=2,j=0;i<128;)                                                        //复制笑脸图案到中间
  598.          {        
  599.                 lhj[i]=XL[j];
  600.                 lhj[i+1]=XL[j+1];

  601.                   i=i+8;
  602.                 j=j+2;
  603.             }
  604.          
  605.         for(i=4,j=0;i<128;)                                                        //复制安卓机器人图案到中间
  606.                  {        
  607.                         lhj[i]=ANZHUO[j];
  608.                         lhj[i+1]=ANZHUO[j+1];
  609.         
  610.                           i=i+8;
  611.                         j=j+2;
  612.                     }
  613.          displayS(4);                                      //显示图案约2秒

  614. }



  615. void shijianzz()
  616. {
  617. /***************************************************///时间自增
  618.         if(numf > 59)                           //分钟numf,小时nums自增
  619.         {
  620.                 numf = 0;
  621.                 nums++;
  622.                 if(nums > 23)
  623.                         {
  624.                         nums = 0;
  625.                         numday++;

  626.                         switch(nummonth)
  627.                         {
  628.                         case 1:
  629.                         case 3:
  630.                         case 5:
  631.                         case 7:
  632.                         case 8:
  633.                         case 10:
  634.                         case 12:  if(numday > 31)
  635.                                                 {        nummonth++;
  636.                                                         numday=1;
  637.                                                         if(nummonth > 12)
  638.                                                                 {
  639.                                                                  nummonth =1;
  640.                                                                  numyear++;        
  641.                                                                 }
  642.                                                 };        
  643.                                                 break;                                       
  644.                                           
  645.                         case 4:
  646.                         case 6:
  647.                         case 9:
  648.                         case 11:if(numday > 30)
  649.                                                 {        nummonth++;
  650.                                                         numday=1;
  651.                                                         if(nummonth > 12)
  652.                                                                 {nummonth =1;
  653.                                                                  numyear++;
  654.                                                                 }
  655.                                                 };        
  656.                                                 break;                                       

  657.                         case 2:        {
  658.                                          if(numyear%4==0)
  659.                                                 if(numday > 29  )
  660.                                                 {
  661.                                                         nummonth++;
  662.                                                         numday=1;
  663.                                                         if(nummonth > 12)
  664.                                                                 {nummonth = 1;
  665.                                                                  numyear++;
  666.                                                                 }        
  667.                                                 }
  668.                                          else
  669.                                                 if(numday > 28  )
  670.                                                 {
  671.                                                         nummonth++;
  672.                                                         numday=1;
  673.                                                         if(nummonth > 12)
  674.                                                                 {nummonth =1;
  675.                                                                  numyear++;
  676.                                                                 }        
  677.                                                 }
  678.                                         };break;        
  679.                         }
  680.                         
  681.                 }
  682.         }
  683. /*********************************************************/
  684. }

  685. void displayXNKL()
  686. {
  687.                  /*********逐个显示“老师们好”************/        
  688.         uchar i,j;
  689.         for(i=0,j=0;i<128;)               
  690.         {        
  691.                 lhj[i]=LAO[j];
  692.                 lhj[i+1]=LAO[j+1];

  693.                   i=i+8;
  694.                 j=j+2;
  695.         }
  696.         displayS(2);
  697.         
  698.         for(i=2,j=0;i<128;)               
  699.         {        
  700.                 lhj[i]=SHI1[j];
  701.                 lhj[i+1]=SHI1[j+1];

  702.                   i=i+8;
  703.                 j=j+2;
  704.         }
  705.         displayS(2);
  706.         
  707.         for(i=4,j=0;i<128;)               
  708.         {        
  709.                 lhj[i]=MEN[j];
  710.                 lhj[i+1]=MEN[j+1];

  711.                   i=i+8;
  712.                 j=j+2;
  713.         }
  714.         displayS(2);
  715.         
  716.         for(i=6,j=0;i<128;)               
  717.         {        
  718.                 lhj[i]=HAO[j];
  719.                 lhj[i+1]=HAO[j+1];

  720.                   i=i+8;
  721.                 j=j+2;
  722.         }
  723.         displayS(2);
  724. /**********************************/        

  725. }

  726. /********************** 主函数 *************************************/
  727. void main(void)           
  728. {

  729.         init();            //初始化程序
  730.         displaytu_an();
  731.         displayS(4);                  
  732.         while(1)
  733.         {
  734.          shijianzz();                                        //时间自增函数
  735.         displaymovetb(1,0,4,3);                         //向下清屏
  736.         displaymove(DIAN,4,1);                          //左跑马 “电气工程”
  737.         displayS(2);
  738.         displaymovetb(1,0,4,2);                        //向下卷帘清屏
  739.         displayXNKL();                                   //由左往右显示‘老师们好’
  740.         displayS(2);
  741.         displaymove(0,4,2);                    //左跑马清屏
  742.         displaymovetb(1,BEI,4,3);            //向下显示 “北京时间”
  743.         displayS(2);
  744.         displaymovetb(0,el,4,1);
  745.         displayS(2);
  746.         displaymovetb(1,lw,4,2);
  747.         displayS(2);
  748.         displaymove(xie,4,1);
  749.         displayS(3);
  750.         displaymovetb(1,0,4,3);                        //向下清屏
  751.         displaytu_an();
  752.         displayS(2);
  753.         /*displaymovetb(1,0,4,1);
  754.         displaynyr();                                    //显示****年**月**日
  755.         displayshijian();                            //调用显示**点**分 时间函数
  756.         displayS(4000);*/           
  757.         
  758.         }

  759. }
  760. /********************** 主函数 *************************************/

  761. void display2()                  //显示子函数 中断调用才使用
  762. {        
  763.         unsigned char i,ia,tmp;        
  764.         unsigned int j;
  765.         DATAOUT=0XFF;                                       
  766.         AB=0;                                                                                //将行数据位清0,准备移位
  767.         for(i=0;i<16;i++)
  768.         {               
  769.                 SCK=0;                        
  770.                 SCLT=0;                        
  771.                 for(ia=8;ia>0;)
  772.                 {                                                //每行64个点,循环位移8个字节
  773.                 ia--;                                                                        //循环四次
  774.                  tmp=~lhj[i*8+ia];        
  775.                         for(j=0;j<8;j++)
  776.                         {                                                //循环两次,每次移一个字节,
  777.                                 SCLH=0;                        
  778.                              DATA=tmp&0x01;                                             //将数据低位做输出
  779.                                 tmp>>=1;         
  780.                              SCLH=1;                                                                //将DATA上的数据移入寄存器
  781.                         }                                                                                //移入单字节结束
  782.                 }                                                                                //移入两个字节结束
  783.                 DATAOUT|=0X24;        
  784.                 //等价于SCK=1;               
  785.                 //      SCLT=1;               
  786.                 AB=1;               
  787.         }
  788.         j=100;
  789.         while(j--);                                          //每一行的显示,保持6个字节的移位时间,因此,最后一行的显示,也要加入保持时间,补尝显示的亮度
  790.         SCK=0;                                                  
  791.         SCK=1;                                                  //将最后一行数据移出
  792. }


  793. void display()                                             //显示子函数
  794. {        
  795.         unsigned char i,ia,tmp;        
  796.         unsigned int j;
  797.         DATAOUT=0XFF;                                       
  798.         AB=0;                                                                                //将行数据位清0,准备移位
  799.         for(i=0;i<16;i++)
  800.         {               
  801.                 SCK=0;                        
  802.                 SCLT=0;                        
  803.                 for(ia=8;ia>0;)
  804.                 {                                                //每行64个点,循环位移8个字节
  805.                 ia--;                                                                        //循环四次
  806.                  tmp=~lhj[i*8+ia];        
  807.                         for(j=0;j<8;j++)
  808.                         {                                                //循环两次,每次移一个字节,
  809.                                 SCLH=0;                        
  810.                              DATA=tmp&0x01;                                             //将数据低位做输出
  811.                                 tmp>>=1;         
  812.                              SCLH=1;                                                                //将DATA上的数据移入寄存器
  813.                         }                                                                                //移入单字节结束
  814.                 }                                                                                //移入两个字节结束
  815.                 DATAOUT|=0X24;        
  816.                 //等价于SCK=1;               
  817.                 //      SCLT=1;               
  818.                 AB=1;               
  819.         }
  820.         j=100;
  821.         while(j--);                                          //每一行的显示,保持6个字节的移位时间,因此,最后一行的显示,也要加入保持时间,补尝显示的亮度
  822.         SCK=0;                                                  
  823.         SCK=1;                                                  //将最后一行数据移出
  824. }


  825. void displayS2(unsigned int timer)                   //指定时间扫描显示函数 中断调用时用
  826. {
  827.         unsigned char i;        
  828.         while(timer--)
  829.         {                                  //当timer=1时,大约1秒时间
  830.                 i=20;               
  831.                 while(i--)
  832.                         display2();
  833.         }
  834. }



  835. void displayS(unsigned int timer)            //指定时间扫描显示函数
  836. {
  837.         unsigned char i;        
  838.         while(timer--)
  839.         {                                  //当timer=1时,大约1秒时间
  840.                 i=20;               
  841.                 while(i--)
  842.                         display();
  843.         }
  844. }

  845. void displaymove(unsigned char *lp,unsigned char c,unsigned char timer)//左移显示函数,LP指向要显示第一个字的首地址,C表示显示字的个数,
  846.                                                                                                                                                 //timer是移动的速度
  847. {
  848.         unsigned char i=0,j=0,ia=0;
  849.         unsigned int tmp=0,timerc=0;
  850.         unsigned char tmp2[16];
  851.         c*=2;               
  852.         for(i=0;i<16;i++)
  853.                 tmp2[i]=0;                                            //将缓冲区清0,
  854.         while(c)
  855.         {
  856.                 if(lp!=0)
  857.                 {                                            //当lp指向的地址为0时,直接用组缓冲0补上,效果是将当前显示的内容移出
  858.                 tmp=c%2;                                                                        //取余,目的是为了判断处理汉字的前半部份还是后半部份
  859.                 for(i=0;i<16;i++)
  860.                         {               
  861.                                 tmp2[i]=lp[i*2+tmp];                                        //取半个汉字点阵数据,16字节
  862.                         }
  863.                 if(tmp)                                                                                //当tmp为1时,表时一个字数组处理完成,将地址转到下一个字
  864.                         lp+=32;
  865.                 }
  866.                 //--------------
  867.                 tmp=8;                                                                                //变量再次利用
  868.                 while(tmp)
  869.                 {                                                                        //循环8次,是将下一个字的前半部份的字节数据移入显示缓冲        
  870.                 ia=0;                                                                                //做为点阵数组的元素
  871.                 for(i=0;i<16;i++)
  872.                 {                                                        //移动是16行同时移,因此要处理16个字节
  873.                         for(j=0;j<7;j++)
  874.                         {                                                //一行32个点四字节,有三字节在显示缓冲中移动
  875.                                 lhj[ia]<<=1;                                                //移当前显示缓冲的半行字节
  876.                                 if(lhj[ia+1]&0x80)                                        //判断后半行字节的高位是否为1,是移入前半行字节低位,否则不处理
  877.                                         lhj[ia]++;
  878.                                 ia++;
  879.                         }
  880.                         lhj[ia]<<=1;                                                        //一行32个点四字节,将最后一字节用下一个字补上
  881.                         if(tmp2[i]&0x80)                                                //判断下一个要显示汉字的前半行字节的高位是否为1,是移入,否则不处理
  882.                                 lhj[ia]++;
  883.                         ia++;
  884.                         tmp2[i]<<=1;                                                        //下一个要显示汉字的半行字节向高位移一位,准备下一次取位
  885.                 }
  886.                 tmp--;
  887.                 timerc=timer;                                                                //处理完16行,调用显示函数更新点阵
  888.                 while(timerc--)                                                                        //循环做为处理的速度,即移动的速度
  889.                         display();
  890.                 }
  891.                 //----------
  892.                 c--;                                                                                        //移完一半,进入下一半或下一个汉字,直到结束
  893.         }
  894. }


  895. void displaymove2(unsigned char *lp,unsigned char c,unsigned char timer)//左移显示函数,LP指向要显示第一个字的首地址,C表示显示字的个数,
  896.                                                                                                                                                 //timer是移动的速度
  897. {
  898.         unsigned char i=0,j=0,ia=0;
  899.         unsigned int tmp=0,timerc=0;
  900.         unsigned char tmp2[16];
  901.         c*=2;               
  902.         for(i=0;i<16;i++)
  903.                 tmp2[i]=0;                                            //将缓冲区清0,
  904.         while(c)
  905.         {
  906.                 if(lp!=0)
  907.                 {                                            //当lp指向的地址为0时,直接用组缓冲0补上,效果是将当前显示的内容移出
  908.                 tmp=c%2;                                                                        //取余,目的是为了判断处理汉字的前半部份还是后半部份
  909.                 for(i=0;i<16;i++)
  910.                         {               
  911.                                 tmp2[i]=lp[i*2+tmp];                                        //取半个汉字点阵数据,16字节
  912.                         }
  913.                 if(tmp)                                                                                //当tmp为1时,表时一个字数组处理完成,将地址转到下一个字
  914.                         lp+=32;
  915.                 }
  916.                 //--------------
  917.                 tmp=8;                                                                                //变量再次利用
  918.                 while(tmp)
  919.                 {                                                                        //循环8次,是将下一个字的前半部份的字节数据移入显示缓冲        
  920.                 ia=0;                                                                                //做为点阵数组的元素
  921.                 for(i=0;i<16;i++)
  922.                 {                                                        //移动是16行同时移,因此要处理16个字节
  923.                         for(j=0;j<7;j++)
  924.                         {                                                //一行32个点四字节,有三字节在显示缓冲中移动
  925.                                 lhj[ia]<<=1;                                                //移当前显示缓冲的半行字节
  926.                                 if(lhj[ia+1]&0x80)                                        //判断后半行字节的高位是否为1,是移入前半行字节低位,否则不处理
  927.                                         lhj[ia]++;
  928.                                 ia++;
  929.                         }
  930.                         lhj[ia]<<=1;                                                        //一行32个点四字节,将最后一字节用下一个字补上
  931.                         if(tmp2[i]&0x80)                                                //判断下一个要显示汉字的前半行字节的高位是否为1,是移入,否则不处理
  932.                                 lhj[ia]++;
  933.                         ia++;
  934.                         tmp2[i]<<=1;                                                        //下一个要显示汉字的半行字节向高位移一位,准备下一次取位
  935.                 }
  936.                 tmp--;
  937.                 timerc=timer;                                                                //处理完16行,调用显示函数更新点阵
  938.                 while(timerc--)                                                                        //循环做为处理的速度,即移动的速度
  939.                         display2();
  940.                 }
  941.                 //----------
  942.                 c--;                                                                                        //移完一半,进入下一半或下一个汉字,直到结束
  943.         }
  944. }




  945. void displaymovetb(unsigned char din,unsigned char *lp,unsigned char c,unsigned char timer)
  946. //上下移动显示函数,din:1为向下,0为向上,lp指向要移入的内容,C表示有几个汉字要移,timer为移动速度
  947. {
  948.         unsigned char i=0,j=0,ia=0,ib=0,ic=0,id=0;
  949.         unsigned int tmp=0,timerc=0;
  950.         if(din)
  951.         {                                                                                                        //判断移动方向,向下
  952.         ia=32;                                                                                                        //要移入第一个汉字的数组元素
  953.         ib=64;                                                                                                        //要移入第二个汉字的数组元素
  954.         ic=96;
  955.         id=128;
  956.         i=16;                                                                                                        //行索引
  957.         while(i--)
  958.         {                                                                                                       //逐行处理
  959.                   j=120;
  960.                 while(j)
  961.                 {
  962.                         j--;
  963.                         lhj[j+8]=lhj[j];                                                                //将上一行的内容复制到下一行,每两行内容相隔6个字节,复制15行
  964.                 }
  965.                 if(lp==0)
  966.                 {                                                                                        //最后一行的处理,判断移入的内容是否为空,是用0移入
  967.                         j=8;
  968.                         while(j--)
  969.                                 lhj[j]=0;
  970.                 }
  971.                 else
  972.                 {                                                                                                //否则,取字数组处理
  973.                         ia--;ib--;ic--;id--        ;

  974.                         if(c==4)
  975.                         {                                                                                //判断4个字,移一行,6个字节
  976.                         lhj[1]=lp[ia];
  977.                         ia--;
  978.                         lhj[0]=lp[ia];
  979.                         lhj[3]=lp[ib];
  980.                         ib--;
  981.                         lhj[2]=lp[ib];
  982.                         lhj[5]=lp[ic];
  983.                         ic--;
  984.                         lhj[4]=lp[ic];
  985.                         lhj[7]=lp[id];
  986.                         id--;
  987.                         lhj[6]=lp[id];
  988.                         }


  989.                         else if(c==3)
  990.                         {                                                                //否则3个字,将字放在中间,旁边补0
  991.                         lhj[0]=0;
  992.                         lhj[2]=lp[ia];
  993.                         ia--;
  994.                         lhj[1]=lp[ia];
  995.                         lhj[4]=lp[ib];
  996.                         ib--;
  997.                         lhj[3]=lp[ib];
  998.                         lhj[6]=lp[ic];
  999.                         ic--;
  1000.                         lhj[5]=lp[ic];
  1001.                         lhj[7]=0;
  1002.                         }

  1003.                         else if(c==2)
  1004.                         {                                                                //否则2个字,将字放在中间,旁边补0
  1005.                         lhj[0]=0;
  1006.                         lhj[1]=0;

  1007.                         lhj[3]=lp[ia];
  1008.                         ia--;
  1009.                         lhj[2]=lp[ia];
  1010.                         lhj[5]=lp[ib];
  1011.                         ib--;
  1012.                         lhj[4]=lp[ib];                        
  1013.                         lhj[6]=0;
  1014.                          lhj[7]=0;
  1015.                         }
  1016.                         else if(c==1)
  1017.                         {                                                                //否则1个字,将字放在中间,旁边补0
  1018.                         lhj[0]=0;
  1019.                         lhj[1]=0;
  1020.                          lhj[2]=0;

  1021.                         lhj[4]=lp[ia];
  1022.                         ia--;
  1023.                         lhj[3]=lp[ia];

  1024.                         lhj[5]=0;        
  1025.                         lhj[6]=0;
  1026.                         lhj[7]=0;

  1027.                         }
  1028.                 }
  1029.                 timerc=timer;                                                                //处理完16行,调用显示函数更新点阵
  1030.                 while(timerc--)                                                                //循环做为处理的速度,即移动的速度
  1031.                         display();
  1032.         }
  1033.         }
  1034.         else
  1035.         {                                                                                        //移动方向,向上
  1036.         ia=0;ib=32;ic=64;id=96;                                                        //向上移动,移入汉字从低位开始

  1037.                 for(i=0;i<16;i++)
  1038.                 {                                                        //处理16行
  1039.                         for(j=0;j<120;j++)                                                //将下一行的内容复制到上一行,每两行内容相隔6个字节,复制15行
  1040.                                 lhj[j]=lhj[j+8];
  1041.                         if(lp==0)
  1042.                         {                                                                //最后一行的处理,判断移入的内容是否为空,是用0移入
  1043.                                 while(j!=128)
  1044.                                 {
  1045.                                         lhj[j]=0;
  1046.                                         j++;
  1047.                                    }
  1048.                         }
  1049.                         else
  1050.                         {                                                                        //否则,取字数组处理
  1051.                         if(c==4)
  1052.                         {                                                                  //判断4个字,移一行,8个字节                                       
  1053.                                 lhj[120]=lp[ia];
  1054.                                 lhj[121]=lp[ia+1];
  1055.                                 lhj[122]=lp[ib];
  1056.                                 lhj[123]=lp[ib+1];
  1057.                                 lhj[124]=lp[ic];
  1058.                                 lhj[125]=lp[ic+1];
  1059.                                  lhj[126]=lp[id];
  1060.                                  lhj[127]=lp[id+1];

  1061.                                 ia+=2;ib+=2;ic+=2;id+=2;                           
  1062.                         }
  1063.                         else if(c==3)
  1064.                         {                                                        //否则3个字,将字放在中间,旁边补0
  1065.                                 lhj[120]=0;
  1066.                                 lhj[121]=lp[ia];
  1067.                                 lhj[122]=lp[ia+1];
  1068.                                 lhj[123]=lp[ib];
  1069.                                 lhj[124]=lp[ib+1];
  1070.                                 lhj[125]=lp[ic];
  1071.                                 lhj[126]=lp[ic+1];
  1072.                                 lhj[127]=0;
  1073.                                 ia+=2;ib+=2;ic+=2;
  1074.                         }
  1075.                         else if(c==2)
  1076.                         {                                                                //否则2个字,将字放在中间,旁边补0
  1077.                                 lhj[120]=0;
  1078.                                 lhj[121]=0;
  1079.                                 lhj[122]=lp[ia];
  1080.                                 lhj[123]=lp[ia+1];
  1081.                                 lhj[124]=lp[ib];
  1082.                                 lhj[125]=lp[ib+1];
  1083.                                 lhj[126]=0;
  1084.                                 lhj[127]=0;
  1085.                                 ia+=2;ib+=2;
  1086.                         }
  1087.                         else
  1088.                         {                                                                                //判断1个字,移一行,8个字节,将字放在中间,两边补0
  1089.                                 lhj[120]=0;
  1090.                                 lhj[121]=0;
  1091.                                 lhj[122]=0;
  1092.                                 lhj[123]=lp[ia];
  1093.                                 ia++;
  1094.                                 lhj[124]=lp[ia];
  1095.                                 ia++;
  1096.                                 lhj[125]=0;
  1097.                                 lhj[126]=0;
  1098.                                 lhj[127]=0;

  1099.                          }
  1100.                         }
  1101.                 timerc=timer;                                                                //处理完16行,调用显示函数更新点阵
  1102.                 while(timerc--)                                                                //循环做为处理的速度,即移动的速度
  1103.                         display();
  1104.                    }
  1105.            }
  1106.                         
  1107. }


  1108. void displaymovetb2(unsigned char din,unsigned char *lp,unsigned char c,unsigned char timer)
  1109. //上下移动显示函数,din:1为向下,0为向上,lp指向要移入的内容,C表示有几个汉字要移,timer为移动速度
  1110. {
  1111.         unsigned char i=0,j=0,ia=0,ib=0,ic=0,id=0;
  1112.         unsigned int tmp=0,timerc=0;
  1113.         if(din)
  1114.         {                                                                                                        //判断移动方向,向下
  1115.         ia=32;                                                                                                        //要移入第一个汉字的数组元素
  1116.         ib=64;                                                                                                        //要移入第二个汉字的数组元素
  1117.         ic=96;
  1118.         id=128;
  1119.         i=16;                                                                                                        //行索引
  1120.         while(i--)
  1121.         {                                                                                                       //逐行处理
  1122.                   j=120;
  1123.                 while(j)
  1124.                 {
  1125.                         j--;
  1126.                         lhj[j+8]=lhj[j];                                                                //将上一行的内容复制到下一行,每两行内容相隔6个字节,复制15行
  1127.                 }
  1128.                 if(lp==0)
  1129.                 {                                                                                        //最后一行的处理,判断移入的内容是否为空,是用0移入
  1130.                         j=8;
  1131.                         while(j--)
  1132.                                 lhj[j]=0;
  1133.                 }
  1134.                 else
  1135.                 {                                                                                                //否则,取字数组处理
  1136.                         ia--;ib--;ic--;id--        ;

  1137.                         if(c==4)
  1138.                         {                                                                                //判断4个字,移一行,6个字节
  1139.                         lhj[1]=lp[ia];
  1140.                         ia--;
  1141.                         lhj[0]=lp[ia];
  1142.                         lhj[3]=lp[ib];
  1143.                         ib--;

  1144.                         lhj[2]=lp[ib];

  1145.                         lhj[5]=lp[ic];
  1146.                         ic--;
  1147.                         lhj[4]=lp[ic];

  1148.                         lhj[7]=lp[id];
  1149.                         id--;
  1150.                         lhj[6]=lp[id];
  1151.                         }

  1152.                         else if(c==3)
  1153.                         {                                                                //否则3个字,将字放在中间,旁边补0
  1154.                         lhj[0]=0;
  1155.                         lhj[2]=lp[ia];
  1156.                         ia--;
  1157.                         lhj[1]=lp[ia];
  1158.                         lhj[4]=lp[ib];
  1159.                         ib--;
  1160.                         lhj[3]=lp[ib];
  1161.                         lhj[6]=lp[ic];
  1162.                         ic--;
  1163.                         lhj[5]=lp[ic];
  1164.                         lhj[7]=0;
  1165.                         }


  1166.                         else if(c==2)
  1167.                         {                                                                //否则2个字,将字放在中间,旁边补0
  1168.                         lhj[0]=0;
  1169.                         lhj[1]=0;

  1170.                         lhj[3]=lp[ia];
  1171.                         ia--;
  1172.                         lhj[2]=lp[ia];
  1173.                         lhj[5]=lp[ib];
  1174.                         ib--;
  1175.                         lhj[4]=lp[ib];                        
  1176.                         lhj[6]=0;
  1177.                          lhj[7]=0;

  1178.                         }
  1179.                         else if(c==1)
  1180.                         {                                                                //否则1个字,将字放在中间,旁边补0
  1181.                         lhj[0]=0;
  1182.                         lhj[1]=0;
  1183.                          lhj[2]=0;

  1184.                         lhj[4]=lp[ia];
  1185.                         ia--;
  1186.                         lhj[3]=lp[ia];

  1187.                         lhj[5]=0;        
  1188.                         lhj[6]=0;
  1189.                         lhj[7]=0;

  1190.                         }
  1191.                 }
  1192.                 timerc=timer;                                                                //处理完16行,调用显示函数更新点阵
  1193.                 while(timerc--)                                                                //循环做为处理的速度,即移动的速度
  1194.                         display();
  1195.         }
  1196.         }
  1197.         else
  1198.         {                                                                                        //移动方向,向上
  1199.         ia=0;ib=32;ic=64;id=96;                                                        //向上移动,移入汉字从低位开始

  1200.                 for(i=0;i<16;i++)
  1201.                 {                                                        //处理16行
  1202.                         for(j=0;j<120;j++)                                                //将下一行的内容复制到上一行,每两行内容相隔6个字节,复制15行
  1203.                                 lhj[j]=lhj[j+8];
  1204.                         if(lp==0)
  1205.                         {                                                                //最后一行的处理,判断移入的内容是否为空,是用0移入
  1206.                                 while(j!=128)
  1207.                                 {
  1208.                                         lhj[j]=0;
  1209.                                         j++;
  1210.                                    }
  1211.                         }
  1212.                         else
  1213.                         {                                                                        //否则,取字数组处理
  1214.                         if(c==4)
  1215.                         {                                                                  //判断4个字,移一行,8个字节                                       
  1216.                                 lhj[120]=lp[ia];
  1217.                                 lhj[121]=lp[ia+1];
  1218.                                 lhj[122]=lp[ib];
  1219.                                 lhj[123]=lp[ib+1];
  1220.                                 lhj[124]=lp[ic];
  1221.                                 lhj[125]=lp[ic+1];
  1222.                                  lhj[126]=lp[id];
  1223.                                  lhj[127]=lp[id+1];

  1224.                                 ia+=2;ib+=2;ic+=2;id+=2;                           
  1225.                         }
  1226.                         else if(c==3)
  1227.                         {                                                        //否则3个字,将字放在中间,旁边补0
  1228.                                 lhj[120]=0;
  1229.                                 lhj[121]=lp[ia];
  1230.                                 lhj[122]=lp[ia+1];
  1231.                                 lhj[123]=lp[ib];
  1232.                                 lhj[124]=lp[ib+1];
  1233.                                 lhj[125]=lp[ic];
  1234.                                 lhj[126]=lp[ic+1];
  1235.                                 lhj[127]=0;
  1236.                                 ia+=2;ib+=2;ic+=2;
  1237.                         }
  1238.                         else if(c==2)
  1239.                         {                                                                //否则2个字,将字放在中间,旁边补0
  1240.                                 lhj[120]=0;
  1241.                                 lhj[121]=0;
  1242.                                 lhj[122]=lp[ia];
  1243.                                 lhj[123]=lp[ia+1];
  1244.                                 lhj[124]=lp[ib];
  1245.                                 lhj[125]=lp[ib+1];
  1246.                                 lhj[126]=0;
  1247.                                 lhj[127]=0;
  1248.                                 ia+=2;ib+=2;
  1249.                         }
  1250.                         else
  1251.                         {                                                                                //判断1个字,移一行,8个字节,将字放在中间,两边补0
  1252.                                 lhj[120]=0;
  1253.                                 lhj[121]=0;
  1254.                                 lhj[122]=0;
  1255.                                 lhj[123]=lp[ia];
  1256.                                 ia++;
  1257.                                 lhj[124]=lp[ia];
  1258.                                 ia++;
  1259.                                 lhj[125]=0;
  1260.                                 lhj[126]=0;
  1261.                                 lhj[127]=0;
  1262.                          }
  1263.                         }
  1264.                 timerc=timer;                                                                //处理完16行,调用显示函数更新点阵
  1265.                 while(timerc--)                                                                //循环做为处理的速度,即移动的速度
  1266.                         display();
  1267.                    }
  1268.            }                        
  1269. }
复制代码


评分

参与人数 4黑币 +64 收起 理由
茶树康宁 + 4 绝世好帖!
ytteria0001 + 5 很给力!
REN7777777 + 5 共享资料的黑币奖励!
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏17 分享淘帖 顶6 踩
回复

使用道具 举报

沙发
ID:79352 发表于 2015-6-25 17:10 | 只看该作者
欢饮大家下载
回复

使用道具 举报

板凳
ID:1 发表于 2016-5-12 03:37 | 只看该作者
这个设计很不错,51黑有你更精彩!!!
回复

使用道具 举报

地板
ID:120780 发表于 2016-5-14 17:55 | 只看该作者
新手学习了
回复

使用道具 举报

5#
ID:82418 发表于 2016-8-17 00:05 | 只看该作者
点阵显示屏
回复

使用道具 举报

6#
ID:139216 发表于 2016-9-12 19:32 | 只看该作者
有没有proteus仿真图啊?
回复

使用道具 举报

7#
ID:143143 发表于 2016-10-17 22:45 | 只看该作者
楼主,有个毕业设计也是点阵屏汉字显示,要求能在pc端控制输出的汉字,能够联系下探讨探讨
回复

使用道具 举报

8#
ID:94489 发表于 2016-10-22 01:32 | 只看该作者
谢谢楼主
回复

使用道具 举报

9#
ID:148617 发表于 2016-11-20 18:02 | 只看该作者

有没有proteus仿真图啊?
回复

使用道具 举报

10#
ID:68023 发表于 2016-12-21 13:40 | 只看该作者
厉害,感谢分享
回复

使用道具 举报

11#
ID:157635 发表于 2016-12-26 02:08 | 只看该作者
可以的  好东西 值得一顶
回复

使用道具 举报

12#
ID:136460 发表于 2016-12-28 16:19 | 只看该作者
谢谢楼主
回复

使用道具 举报

13#
ID:159418 发表于 2017-1-2 18:19 | 只看该作者
下载下来结果发现。。。。。
回复

使用道具 举报

14#
ID:61840 发表于 2017-1-2 19:28 | 只看该作者
不错,好好学学,应该有帮助
回复

使用道具 举报

15#
ID:154915 发表于 2017-1-2 19:32 | 只看该作者
写的好多,辛苦了!
回复

使用道具 举报

16#
ID:193466 发表于 2017-4-27 13:30 | 只看该作者
写的真棒楼主有做三基色的显示屏吗
回复

使用道具 举报

17#
ID:105115 发表于 2017-5-6 16:35 | 只看该作者
谢谢楼主! 我这里正好有16*64的点阵屏 。参考下看能不能改一个出来、
回复

使用道具 举报

18#
ID:201036 发表于 2017-5-15 17:42 | 只看该作者
感谢大神的分享
回复

使用道具 举报

19#
ID:194752 发表于 2017-5-16 10:26 | 只看该作者
不知道什么时候我也能写出这样的程序。。。很是羡慕。。。我继续学习。。感谢分享,下载保存以备之后学习!
回复

使用道具 举报

20#
ID:200118 发表于 2017-5-16 20:23 | 只看该作者
好资料,下载学习
回复

使用道具 举报

21#
ID:195909 发表于 2017-6-4 09:24 | 只看该作者
很好,很实用的哦
回复

使用道具 举报

22#
ID:202876 发表于 2017-6-4 12:44 | 只看该作者
多谢楼主分享,对我很有帮助
回复

使用道具 举报

23#
ID:207669 发表于 2017-6-4 14:51 | 只看该作者
厉害厉害!
回复

使用道具 举报

24#
ID:231031 发表于 2017-9-5 08:40 | 只看该作者
不错 很好
回复

使用道具 举报

25#
ID:138091 发表于 2017-9-5 09:18 | 只看该作者
不错,注释也很详细,很有用!
回复

使用道具 举报

26#
ID:140183 发表于 2017-10-21 19:49 | 只看该作者
谢谢分享!是学习的很好资料.
回复

使用道具 举报

27#
ID:130345 发表于 2017-10-22 00:12 | 只看该作者
感谢楼主分享
回复

使用道具 举报

28#
ID:261637 发表于 2017-12-15 16:07 | 只看该作者
有没有proteus仿真图啊?
回复

使用道具 举报

29#
ID:306594 发表于 2018-4-16 10:42 | 只看该作者
我是小勇 发表于 2016-10-17 22:45
**** 作者被禁止或删除 内容自动屏蔽 ****

哇,我现在的毕设就是你这个可以请教下大神吗
回复

使用道具 举报

30#
ID:34081 发表于 2018-4-24 08:22 | 只看该作者
谢谢楼主的分享,好好的学习一下
回复

使用道具 举报

31#
ID:319609 发表于 2018-5-1 13:57 | 只看该作者
终于找到了这个 不知道电路图怎么样
回复

使用道具 举报

32#
ID:321692 发表于 2018-5-3 23:46 | 只看该作者
程序好长,不过我做的8*16的
回复

使用道具 举报

33#
ID:341786 发表于 2018-5-30 22:15 | 只看该作者
厉害啦楼主
回复

使用道具 举报

34#
ID:79631 发表于 2018-9-7 15:18 | 只看该作者
厉害啦楼主
回复

使用道具 举报

35#
ID:412035 发表于 2018-10-18 23:30 | 只看该作者
厉害了毕业设计有希望了,谢谢楼主
回复

使用道具 举报

36#
ID:418403 发表于 2018-12-6 13:59 | 只看该作者
绝世好帖!
回复

使用道具 举报

37#
ID:454207 发表于 2018-12-25 15:57 | 只看该作者
感谢楼主分享用处很大
回复

使用道具 举报

38#
ID:475484 发表于 2019-3-27 07:54 | 只看该作者
谢谢楼主。不知道能不能修改用于08接口的屏。
回复

使用道具 举报

39#
ID:612449 发表于 2019-9-24 13:08 | 只看该作者
感谢!
回复

使用道具 举报

40#
ID:612449 发表于 2019-9-24 13:08 | 只看该作者
感谢楼主
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表