|
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
//#include "HT1621.h"
#define CONPORT PORTD
#define CONDDR DDRD
#define CS 3
#define RD 2
#define WR 1
#define DATA 0
#define CS_H CONPORT |= (1<<CS)
#define CS_L CONPORT &= ~(1<<CS)
#define WR_H CONPORT |= (1<<WR)
#define WR_L CONPORT &= ~(1<<WR)
#define RD_H CONPORT |= (1<<RD)
#define RD_L CONPORT &= ~(1<<RD)
#define DATA_H CONPORT |= (1<<DATA)
#define DATA_L CONPORT &= ~(1<<DATA)
#define CS_O CONDDR |= (1<<CS)
#define WR_O CONDDR |= (1<<WR)
#define RD_O CONDDR |= (1<<RD)
#define DATA_O CONDDR |= (1<<DATA)
#define _CMD_SYS_DIS 0X0
#define _CMD_SYS_EN 0X1
#define _CMD_LCD_OFF 0X2
#define _CMD_LCD_ON 0X3
#define _CMD_TIMER_DIS 0X4
#define _CMD_WDT_DIS 0X5
#define _CMD_TIMER_EN 0X6
#define _CMD_WDT_EN 0X7
#define _CMD_TONF_OFF 0X8
#define _CMD_TONF_ON 0X9
#define _CMD_CLR_TIMER 0XD
#define _CMD_CLR_WDT 0XF
#define _CMD_XTAL_32K 0X14
#define _CMD_RC_256K 0X18
#define _CMD_EXT_256K 0X1C
#define _CMD_2_BIAS 0X28
#define _CMD_3_BIAS 0X29
#define _CMD_TONE_4K 0X40
#define _CMD_TONE_2K 0X60
#define _CMD_IRQ_DIS 0X80
#define _CMD_IRQ_EN 0X88
#define _CMD_F1 0XA0
#define _CMD_F2 0XA1
#define _CMD_F4 0XA2
#define _CMD_F8 0XA3
#define _CMD_F16 0XA4
#define _CMD_F32 0XA5
#define _CMD_F64 0XA6
#define _CMD_F128 0XA7
#define _CMD_TEST 0XE0
#define _CMD_NORMAL 0XE3
#define _lcd_BUSY 0
#define _lcd_AC 1
#define _lcd_PLUS 2
#define _lcd_F1 3
#define _lcd_ERROR 4
#define _lcd_DC 5
#define _lcd_MINUS 6
#define _lcd_F2 7
#define _lcd_DOT0 12
#define _lcd_AUTO 20
#define _lcd_RUN 24
#define _lcd_PAUSE 25
#define _lcd_DOT1 26
#define _lcd_COLON0 27
#define _lcd_DOT2 32
#define _lcd_STOP 40
#define _lcd_KPA 44
#define _lcd_SETUP 45
#define _lcd_DOT3 46
#define _lcd_COLON1 47
#define _lcd_DOT4 52
#define _lcd_KG 60
#define _lcd_MM 64
#define _lcd_KM 65
#define _lcd_L 66
#define _lcd_M3 67
#define _lcd_DB 68
#define _lcd_PERCENT 69
#define _lcd_OHOM 70
#define _lcd_DEGREE 71
#define _lcd_A 72
#define _lcd_V 73
#define _lcd_MHZ 74
#define _lcd_KW 75
#define _lcd_MA 76
#define _lcd_MV 77
#define _lcd_KHZ 78
#define _lcd_W 79
#define _lcd_NG 80
#define _lcd_OK 81
#define _lcd_RX 82
#define _lcd_TX 83
#define _lcd_FM 84
#define _lcd_PM 85
#define _lcd_AM 86
#define _lcd_CARD 87
#define _lcd_AT3 88
#define _lcd_AT2 89
#define _lcd_AT1 90
#define _lcd_AT0 91
#define _lcd_LOCK 95
#define _lcd_BELL 103
#define _lcd_COLON2 111
#define _lcd_BAT 119
#define _lcd_MAX 124
#define _lcd_MIN 125
#define _lcd_CH 126
#define _lcd_FAULT 127
void send_bit_HT1621(unsigned char data,unsigned char cnt) //data 的高cnt 位元写入HT1621,高位在前
{
unsigned char i;
for(i =0; i <cnt; i ++)
{
if((data&0x80)==0) DATA_L;
else DATA_H;
WR_L;
_delay_us(1);
WR_H;
data<<=1;
}
}
void send_data_bit_HT1621(unsigned char data,unsigned char cnt) //data 的低cnt 位写入HT1621,低位在前
{
unsigned char i;
for(i =0; i <cnt; i ++)
{
if((data&0x01)==0) DATA_L;
else DATA_H;
WR_L;
_delay_us(1);
WR_H;
data>>=1;
}
}
void write_CMD_HT1621(unsigned char command)
{
// CS_O;
// WR_O;
// DATA_O;
CS_L;
send_bit_HT1621(0x80,4); //写入模式码“100”和9 位command 命令,由于
send_bit_HT1621(command,8); //没有使有到更改时钟输出等命令,為了编程方便
CS_H; //直接将command 的最高位写“0”
}
void write_data_HT1621(unsigned char addr,unsigned char data)
{
// CS_O;
// WR_O;
// DATA_O;
CS_L;
send_bit_HT1621(0xa0,3); //写入模式码“101”
send_bit_HT1621(addr,6); //写addr 的高6 位元
send_data_bit_HT1621(data,4); //写入data 的低4 位元
CS_H;
}
void write_ht1621_to(unsigned char addr,unsigned char *p,unsigned char cnt)
{
unsigned char i;
// CS_O;
// WR_O;
// DATA_O;
CS_L;
send_bit_HT1621(0xa0,3); //写入模式码“101”
send_bit_HT1621(addr,6); //写addr 的高6 位元
for(i =0; i <cnt; i ++,p++) //连续写入资料
{
send_data_bit_HT1621(*p,8);
}
CS_H;
}
void HT1621_init(void)
{
write_CMD_HT1621(_CMD_2_BIAS); //设置偏压和公共口
write_CMD_HT1621(_CMD_RC_256K); //系统时钟源,片内RC256K 振荡器
write_CMD_HT1621(_CMD_SYS_EN); //打开系统振荡器
write_CMD_HT1621(_CMD_LCD_ON); //打开LCD 偏压发生器
}
int main(void)
{
unsigned char a[10];
a[0]=0x21;a[1]=0x43;a[2]=0x65;a[3]=0x87;a[4]=0xa9;
CONDDR=0xff; //將口設為輸出
_delay_ms(100);
HT1621_init();
write_data_HT1621(0x24,0x01); //0x24: (位址)的高6 位有效,
//0x01: (資料)的低4 位元有效
write_ht1621_to(0,a,5); //0:(起始位址)高6 位有效,
//a:(寫入資料的起始位址)8 位元都有效,
//6:為寫入的位元組數。連續寫入”123456789a”
//SendCmd(LCDOFF); //關閉LCD 顯示
while(1);
} |
|