本人自寫的燃氣炒表程序,,用到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)
2020-1-18 22:30 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|