标题:
HT1621燃气抄表程序
[打印本页]
作者:
YYZZ052
时间:
2020-1-18 22:30
标题:
HT1621燃气抄表程序
本人自写的燃气炒表程序,,用到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
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1