fork download
  1.  
  2. /*16*16點陣屏的顯示*/
  3. /*******************
  4. PIN -- 点阵
  5. -------------------
  6. DATA -- Ser
  7. SCLH -- Srck
  8. SCLT -- rck
  9. AB -- ab
  10. SC -- ck
  11. *******************/
  12.  
  13. int DATA=3; //列數據輸出位
  14. int SCLH=4; //列掃描時觸發位
  15. int SCLT=5; //列數據鎖存位
  16. int AB =6; //行數據輸出位
  17. int SC=7; //行掃描時觸發位
  18. unsigned char i=0,j=0;
  19. unsigned char date[32]; //32字節RAM做為16*16點陣屏顯示緩存
  20.  
  21. void setup() {
  22. // initialize the digital pin as an output.
  23. pinMode(DATA, OUTPUT);
  24. pinMode(SCLH, OUTPUT);
  25. pinMode(SCLT, OUTPUT);
  26. pinMode(AB, OUTPUT);
  27. pinMode(SC, OUTPUT);
  28. }
  29.  
  30. int table1[32]={
  31. 0x00,0x04,0x00,0x04,0x00,0x0C,0x00,0x3C,0x00,0xE4,0x03,0xC4,0x0E,0x40,0x18,0x40,
  32. 0x1C,0x40,0x1F,0x40,0x07,0xE4,0x01,0xFC,0x00,0x7C,0x00,0x1C,0x00,0x04,0x00,0x04};/*"A"*/
  33. int table2[32]={
  34. 0x00,0x04,0x10,0x04,0x1F,0xFC,0x1F,0xFC,0x1F,0xFC,0x11,0x84,0x11,0x84,0x11,0x84,
  35. 0x11,0x84,0x11,0x84,0x11,0x84,0x1F,0x8C,0x1F,0xFC,0x0E,0x78,0x00,0x30,0x00,0x00};/*"B"*/
  36. int table3[32]={
  37. 0x00,0x00,0x03,0xE0,0x07,0xF0,0x0F,0xF8,0x0C,0x1C,0x18,0x0C,0x10,0x04,0x10,0x04,
  38. 0x10,0x04,0x10,0x04,0x10,0x04,0x10,0x04,0x10,0x08,0x18,0x08,0x0C,0x30,0x00,0x00};/*"C"*/
  39. int table4[32]={
  40. 0x00,0x00,0x10,0x04,0x1F,0xFC,0x1F,0xFC,0x1F,0xFC,0x10,0x04,0x10,0x04,0x10,0x04,
  41. 0x10,0x04,0x10,0x0C,0x18,0x0C,0x0C,0x18,0x0F,0xF8,0x07,0xF0,0x03,0xE0,0x00,0x00};/*"D"*/
  42.  
  43. /* 顯示函數 */
  44. void display()
  45. {
  46. unsigned char i,ia,j,tmp; //定義變量
  47. digitalWrite(AB,LOW); //將行數據位清0,準備移位
  48. for(i=0;i<=16;i++) //循環輸出16行數據
  49. {
  50. digitalWrite(SC,LOW); //為行移位做準備
  51. digitalWrite(SCLT,LOW); //為列鎖存做準備
  52. for(ia=2;ia>0;) //每行16個點,循環位移兩個字節,循環兩次
  53. {
  54. ia--;
  55. tmp=date[i*2+ia]; //讀取點陣數據做輸出
  56. shiftOut(DATA,SCLH,LSBFIRST,tmp); //將DATA上的數據移入寄存器
  57. }
  58. PORTD |= 0xa0; //移入两个字节结束,SCK\SCLT拉高.
  59. digitalWrite(AB,HIGH); //行数据位只在第一行时为0,其它时候都为1
  60. //移位的过程,AB就必需是1
  61. }
  62. j=64;
  63. while(j--); //移入兩個字節結束,SCK\SCLT拉高
  64. digitalWrite(SC,LOW);
  65. digitalWrite(SC,HIGH); //行數據位只在第一行時為0,其它時候都為1
  66. //移位的過程,AB就必需是1
  67. }
  68.  
  69. /* timer=1時,為1s左右的延時 */
  70. void display_time(unsigned int timer) //指定時間掃描顯示
  71. {
  72. unsigned char i;
  73. while(timer--)
  74. {
  75. i=50;
  76. while(i--)
  77. display();
  78. }
  79. }
  80.  
  81. void disp()
  82. {
  83. for(i=0;i<32;i++)
  84. date[i]=table1[i];//將"A"字數據複製到顯示緩存
  85. display_time(2); //顯示約2秒
  86.  
  87. for(i=0;i<32;i++)
  88. date[i]=table2[i];//將"B"字數據複製到顯示緩存
  89. display_time(2); //顯示約2秒
  90.  
  91. for(i=0;i<32;i++)
  92. date[i]=table3[i];//將"C"字數據複製到顯示緩存
  93. display_time(2); //顯示約2秒
  94. for(i=0;i<32;i++)
  95. date[i]=table4[i];//將"D"字數據複製到顯示緩存
  96. display_time(2); //顯示約2秒
  97. }
  98. void loop()
  99. {
  100. disp();
  101. }
  102.  
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty