本人自写的燃气炒表程序,,用到HT1621驱动显示屏,希望能帮到大家
单片机源程序如下:
- //ICC-AVR application builder : 2005-3-3 17:58:11
- // Target : M8
- // Crystal: 4.0000Mhz
- //1621引线:CS:PB4 WR:PB5 Data:PB3
- #include <iom8v.h>
- #include <macros.h>
- #include <eeprom.h>
- #define WR 0B00100000//时钟线
- #define DATA 0B00001000//数据线
- #define CS 0b00010000//片选线
- #define P 0x80
- #define data_length 8
- const char seg_tab[]={0x5f,0x06,0x6b,0x2f,0x36,0x3d,0x7d,0x07,0x7f,0x3f,
- 0x77,0x7c,0x59,0x6e,0x79,0x71,0x58,0x76,0x00};
- unsigned char disbuff[6] ={0,0,0,0,0,0};//对应LCD的6位
- unsigned char p1 =0;
- unsigned char p2 =0;
- unsigned long int time =0;//每一毫秒加1
- //1621的显存是4位*32的,故用16*8位的寄存器就能满足要求奇数显存放高4位,偶数放低4位
- /*****************************************************************/
- //1621初始化命令
- const char init_tab[]={
- 0b00000001,//打开系统振荡器命令
- 0b00000011,//打开LCD偏压发生器命令
- 0b00000101,//WDT 溢出标志输出失效命令
- 0b00000110,//时基输出使能命令
- 0b00011000,//系统时钟源片内RC振荡器命令
- 0b00101001,//LCD1/3偏压选项4个公共口命令
- //0b01000000,//声音频率4KHz命令
- //0b00001001,//打开声音输出命令
- 0b10100000,//时基/WDT 时钟输出1Hz命令
- 0b10001000 //使/IRQ 输出有效命令
- };
-
-
- void send_data(unsigned char data_bus,unsigned char loop);
- void delayns(void);
- void display(void);
- void display_init(void);
- void votlageget(void);
- void delay(int temp);
- void port_init(void)
- {
- PORTB = 0xFF;
- DDRB = 0B11111000;
- PORTC = 0x00; //m103 output only
- DDRC = 0x00;
- PORTD = 0xFF;
- DDRD = 0XFF;
- }
- void timer1_init(void)
- {
- TCCR1B = 0x00; //stop
- TCNT1H = 0xFE; //setup
- TCNT1L = 0x0C;
- OCR1AH = 0x01;
- OCR1AL = 0xF4;
- OCR1BH = 0x01;
- OCR1BL = 0xF4;
- ICR1H = 0x01;
- ICR1L = 0xF4;
- TCCR1A = 0x00;
- TCCR1B = 0x02; //start Timer
- }
- #pragma interrupt_handler timer1_ovf_isr:9
- void timer1_ovf_isr(void) //每毫秒中断一次
- {
- //TIMER1 has overflowed
- TCNT1H = 0xFE; //reload counter high value
- TCNT1L = 0x0C; //reload counter low value
- time ++;
-
- disbuff[5] =time&0x0f;
- disbuff[4] =(time>>4)&0x0f;
- disbuff[3] =(time>>8)&0x0f;
- disbuff[2] =(time>>12)&0x0f;
- disbuff[1] =(time>>16)&0x0f;
- disbuff[0] =(time>>20)&0x0f;
-
- display(); //刷新1621的缓存
- }
- //***********************************************************************/
- void display_init(void)
- {
- unsigned char t;
- PORTB &=~CS;
- send_data(0b10000000,3);//送3位命令模式代码100
- for(t=0;t<=7;t++)
- {
- send_data(init_tab[t],9);//送9位命令代码
- }
- PORTB |=CS;
- PORTB |=WR;
- }
- //***********************************************************************/
- void display(void)
- {
- unsigned char t;
- unsigned char seg_temp;
-
- PORTB &=~CS;
- PORTB &=~WR;
- send_data(0b10100000,3);//送3位“写 ”模式命令代码101
- send_data(0,6);//送6位首地址00h
- for(t=0;t<=5;t++)
- {
- seg_temp =seg_tab[disbuff[t]];
-
- send_data(seg_temp,data_length);//向显存送数据
- }
- PORTB |=CS;
- PORTB |=WR;
- }
- //***********************************************************************/
- void send_data(unsigned char data_temp,unsigned char loop)
- {
- for(;loop!=0;loop--)
- {
- delayns();
- PORTB &=~WR;
- delayns();
- if((data_temp&0b10000000)==0)
- {
- PORTB &=~DATA;
- }
- else
- {
- PORTB |=DATA;
- }
- data_temp=(data_temp<<1);
- PORTB |=WR;
- }
- }
- //~~~~~~~~~~~~~~~~~~~~~`
- void delayns(void)
- {
- asm("nop");
- asm("nop");
- asm("nop");
- asm("nop");
- asm("nop");
- asm("nop");
- }
-
- //call this routine to initialize all peripherals
- void init_devices(void)
- {
- //stop errant interrupts until set up
- CLI(); //disable all interrupts
- port_init();
- timer1_init();
- TIMSK = 0x04; //timer interrupt sources
- SEI(); //re-enable interrupts
- }
- void main(void)
- {
- init_devices(); //单片机初始化
- display_init(); //1621初始化
- while(1)
- {
- ;
- }
- }
复制代码
所有资料51hei提供下载:
ht1621.rar
(768.63 KB, 下载次数: 24)
|