单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 178|回复: 0
收起左侧

HT1621燃气抄表程序

[复制链接]
YYZZ052 发表于 2020-1-18 22:30 | 显示全部楼层 |阅读模式
本人自写的燃气炒表程序,,用到HT1621驱动显示屏,希望能帮到大家

单片机源程序如下:
  1. //ICC-AVR application builder : 2005-3-3 17:58:11
  2. // Target : M8
  3. // Crystal: 4.0000Mhz
  4. //1621引线:CS:PB4  WR:PB5  Data:PB3

  5. #include <iom8v.h>
  6. #include <macros.h>
  7. #include <eeprom.h>

  8. #define WR      0B00100000//时钟线
  9. #define DATA    0B00001000//数据线
  10. #define CS      0b00010000//片选线
  11. #define P       0x80      
  12. #define data_length 8
  13. const char   seg_tab[]={0x5f,0x06,0x6b,0x2f,0x36,0x3d,0x7d,0x07,0x7f,0x3f,
  14.                         0x77,0x7c,0x59,0x6e,0x79,0x71,0x58,0x76,0x00};
  15. unsigned char disbuff[6] ={0,0,0,0,0,0};//对应LCD的6位
  16. unsigned char p1 =0;
  17. unsigned char p2 =0;


  18. unsigned long int time =0;//每一毫秒加1
  19. //1621的显存是4位*32的,故用16*8位的寄存器就能满足要求奇数显存放高4位,偶数放低4位
  20. /*****************************************************************/
  21.    //1621初始化命令
  22. const char init_tab[]={
  23.                                                 0b00000001,//打开系统振荡器命令
  24.                              0b00000011,//打开LCD偏压发生器命令
  25.                                         0b00000101,//WDT 溢出标志输出失效命令
  26.                                        0b00000110,//时基输出使能命令
  27.                                        0b00011000,//系统时钟源片内RC振荡器命令
  28.                                        0b00101001,//LCD1/3偏压选项4个公共口命令
  29.                                        //0b01000000,//声音频率4KHz命令
  30.                                        //0b00001001,//打开声音输出命令
  31.                                        0b10100000,//时基/WDT 时钟输出1Hz命令
  32.                                        0b10001000 //使/IRQ 输出有效命令
  33.                                           };
  34.        
  35.        
  36. void send_data(unsigned char data_bus,unsigned char loop);
  37. void delayns(void);
  38. void display(void);
  39. void display_init(void);
  40. void votlageget(void);
  41. void delay(int temp);
  42. void port_init(void)
  43. {
  44. PORTB = 0xFF;
  45. DDRB  = 0B11111000;
  46. PORTC = 0x00; //m103 output only
  47. DDRC  = 0x00;
  48. PORTD = 0xFF;
  49. DDRD  = 0XFF;
  50. }
  51. void timer1_init(void)
  52. {
  53. TCCR1B = 0x00; //stop
  54. TCNT1H = 0xFE; //setup
  55. TCNT1L = 0x0C;
  56. OCR1AH = 0x01;
  57. OCR1AL = 0xF4;
  58. OCR1BH = 0x01;
  59. OCR1BL = 0xF4;
  60. ICR1H  = 0x01;
  61. ICR1L  = 0xF4;
  62. TCCR1A = 0x00;
  63. TCCR1B = 0x02; //start Timer
  64. }

  65. #pragma interrupt_handler timer1_ovf_isr:9
  66. void timer1_ovf_isr(void)     //每毫秒中断一次
  67. {
  68. //TIMER1 has overflowed
  69. TCNT1H = 0xFE; //reload counter high value
  70. TCNT1L = 0x0C; //reload counter low value
  71. time ++;

  72. disbuff[5] =time&0x0f;
  73. disbuff[4] =(time>>4)&0x0f;
  74. disbuff[3] =(time>>8)&0x0f;
  75. disbuff[2] =(time>>12)&0x0f;
  76. disbuff[1] =(time>>16)&0x0f;
  77. disbuff[0] =(time>>20)&0x0f;

  78. display();  //刷新1621的缓存
  79. }

  80. //***********************************************************************/
  81. void display_init(void)
  82. {
  83.   unsigned char t;
  84.   PORTB &=~CS;
  85.   send_data(0b10000000,3);//送3位命令模式代码100
  86.   for(t=0;t<=7;t++)
  87.   {
  88.    send_data(init_tab[t],9);//送9位命令代码
  89.   }
  90.   PORTB |=CS;
  91.   PORTB |=WR;
  92. }

  93. //***********************************************************************/
  94. void display(void)
  95. {
  96.   unsigned char t;
  97.   unsigned char seg_temp;
  98.   
  99.   PORTB &=~CS;
  100.   PORTB &=~WR;
  101.   send_data(0b10100000,3);//送3位“写 ”模式命令代码101
  102.   send_data(0,6);//送6位首地址00h
  103.   for(t=0;t<=5;t++)
  104.   {
  105.     seg_temp =seg_tab[disbuff[t]];
  106.   
  107.     send_data(seg_temp,data_length);//向显存送数据
  108.   }
  109.   PORTB |=CS;
  110.   PORTB |=WR;
  111. }

  112. //***********************************************************************/

  113. void send_data(unsigned char data_temp,unsigned char loop)
  114. {
  115.   for(;loop!=0;loop--)
  116.   {
  117.     delayns();
  118.     PORTB &=~WR;
  119.     delayns();
  120.   if((data_temp&0b10000000)==0)
  121.   {
  122.     PORTB &=~DATA;
  123.   }
  124.   else
  125.   {
  126.     PORTB |=DATA;
  127.   }
  128.     data_temp=(data_temp<<1);
  129.     PORTB |=WR;
  130.   }
  131. }
  132. //~~~~~~~~~~~~~~~~~~~~~`
  133. void delayns(void)
  134. {
  135.   asm("nop");
  136.   asm("nop");
  137.   asm("nop");
  138.   asm("nop");
  139.   asm("nop");
  140.   asm("nop");
  141. }

  142. //call this routine to initialize all peripherals
  143. void init_devices(void)
  144. {
  145. //stop errant interrupts until set up
  146. CLI(); //disable all interrupts
  147. port_init();
  148. timer1_init();
  149. TIMSK = 0x04; //timer interrupt sources
  150. SEI(); //re-enable interrupts
  151. }

  152. void main(void)
  153. {
  154.   init_devices();  //单片机初始化

  155.   display_init();  //1621初始化
  156.   while(1)
  157.   {
  158.     ;
  159.   }
  160. }
复制代码

所有资料51hei提供下载:
ht1621.rar (768.63 KB, 下载次数: 1)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

本版积分规则

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

Powered by 单片机教程网

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