📄 at6010n.c
字号:
/*======================================================
condition:
Controller Board: AMC-5S111 1.0
LCD Controller: SED1335
MCU Mode: arm2119
compiler: keil arm
LCM MODEL: AM320240T-57B68
Designer:Prinse
========================================================
I/O configure:
DataBus------------P1.16~p1.23
A0-----------------P1.25
RD-----------------P1.24
WR-----------------P0.28
LCDCS--------------P0.29
LCDRST-------------P0.30
====================================================*/
#include "Config.h"
#include "bk1.h"
#include "bk2.h"
#include "asc12x6.h"
#define system_set 0x40
#define sleep_in 0x53
#define disp_on 0x59
#define disp_off 0x58
#define scroll 0x44
#define scrform 0x5d
#define cgram_adr 0x5c
#define csrdir_right 0x4c
#define csrdir_left 0x4d
#define csrdir_up 0x4e
#define csrdir_down 0x4f
#define hdot_scr 0x5a
#define ovlay 0x5b
#define csrw 0x46
#define csrr 0x47
#define mwrite 0x42
#define mread 0x43
#define A0 0x02000000
//sbit A0=P3^3;
#define LCDCS 0x20000000
//sbit LCDCS=P1^4;
#define LCDRST 0x40000000
//sbit LCDRST=P1^5;
#define RD 0x01000000
#define WR 0x10000000
#define P1PORT 0x00ff0000
#define ADCINT 0x00010000
#define LP 0x00100000
#define LED1CON (1<<22)
#define TRUE 1
#define FAULT 0
typedef struct UartMode
{
uint8 datab;
uint8 stopb;
uint8 parity;
} UARTMODE;
struct {
unsigned char Xbyte[40];
}Row[240];
uint32 AD_tmp;
unsigned char AD_Buf[3000];
unsigned char AD_Data[230];
uint32 ADC_Data;
uint32 tmp1;
uint16 numb;
uint8 ADC_Flag;
uint16 count;
char str[20];
uint8 com1_on,com2_on,com1_off,com2_off,comu_err,serial_on;
uint8 p1Rx,p2Rx;
uint8 p1Rd,p2Rd;
#define UART_LEN 128
uint8 Uart0_RxBuf[UART_LEN];
uint8 Uart1_RxBuf[UART_LEN];
uint16 SendNumb;
char SendBuf[12];
uint8 OneToPC,AutoToPC;
uint16 AddrNo;
uint8 PC_MK;
uint8 PC_CenterFreq;
uint8 PC_Ref;
uint8 PC_Attn;
uint8 PC_Span;
uint8 PC_ResBW;
uint8 PC_VideoBW;
uint8 PC_UNCAL;
uint8 PC_RM;
uint8 PC_Read;
uint8 PC_Auto;
uint16 buffadd=0; //SRAM缓冲区指针
unsigned char data_len=0; //命令参数个数
//bit cursor_status=0; //光标状态:1,显示;0,不显示。
//bit sleep=0;
unsigned char disp_mode=0; //显示模式;0:240行,无自动换行。1:字符自动换行模式。
unsigned char bit_offset=0;
unsigned char H_font=0; //字体模式:高度放大标志
unsigned char W_font=0; //字体模式:宽度放大
//bit first=0; //复位后未接收数据标志
//bit oky=0; //数据接收完毕标志
//注意:编译器中,汉字字符串读取先低位,后高位。
unsigned char hz_code[2]; //汉字内码缓存
unsigned char hzmatrix[32]; //汉字点阵数据缓存
unsigned char ascii[16]; //ASCII码点阵数据缓存
unsigned char csradd[2]={0,0}; //sed1335光标地址
unsigned char X=0,Y=0; //字符自动换行模式下坐标。
unsigned char system_set_ini[8]={0x34,0x87,0x00,0x27,0x48,0xf0,0x28,0x00};
unsigned char scroll_ini[9]={0x00,0x00,0xf0,0x80,0x25,0xf0,0x00,0x4b,0xf0};
unsigned char scrform_ini[2]={0x07,0x86};
unsigned char hdot_scr_ini[2]={0x00,0x0b};
unsigned char ovlay_ini[1]={0x0e};//{0x0d};
unsigned char disp_on_ini[1]={0x14};//{0x24}; //正常模式,底层2HZ闪烁。
unsigned char disp_off_ini[1]={0x00};
unsigned char cur_set_ini1[2]={0x00,0x00};
unsigned char cur_set_ini2[2]={0x80,0x25};
unsigned char cur_set_ini3[2]={0x00,0x4b};
unsigned char null[]={0x00};
void draw_table()
{
unsigned char i,j;
for(j=0;j<10;++j)
for(i=1;i<240-48;i+=2) {
Row[48+i].Xbyte[j*3]=0x80;
Row[48+i+1].Xbyte[j*3]=0x00;
}
for(j=0;j<8;++j)
for(i=0;i<30;++i) Row[48+24*j].Xbyte[i]=0x55;
for(i=0;i<30;++i) Row[48].Xbyte[i]=0xff;
for(i=0;i<30;++i) Row[239].Xbyte[i]=0xff;
for(i=0;i<240-48;++i) Row[48+i].Xbyte[30]=0x80;
for(i=0;i<240-48;++i) Row[48+i].Xbyte[0]|=0x80;
}
void DelayNS(uint32 dly)
{
uint32 i;
for(;dly>0;dly--)
for(i=0;i<50000;i++);
}
void DelayUS(int t)
{
int i;
for(i=0;i<t;i++);
}
uint8 UART0_Ini(uint32 baud,UARTMODE set)
{
uint32 bak;
if((0==baud)||(baud>115200)) return(0);
if((set.datab<5)||(set.datab>8)) return(0);
if((0==set.stopb)||(set.stopb>2)) return(0);
if(set.parity>4) return(0);
U0LCR=0x80;
bak=(Fpclk>>4)/baud;
U0DLM=bak>>8;
U0DLL=bak&0xff;
bak=set.datab-5;
if(2==set.stopb)bak|=0x04;
if(0!=set.parity)
{
set.parity=set.parity-1;
bak|=0x08;
}
bak|=set.parity<<4;
U0LCR=bak;
U0FCR=0x01;
U0IER=0x01;
return(1);
}
uint8 UART1_Ini(uint32 baud,UARTMODE set)
{
uint32 bak;
if((0==baud)||(baud>115200)) return(0);
if((set.datab<5)||(set.datab>8)) return(0);
if((0==set.stopb)||(set.stopb>2)) return(0);
if(set.parity>4) return(0);
U1LCR=0x80;
bak=(Fpclk>>4)/baud;
U1DLM=bak>>8;
U1DLL=bak&0xff;
bak=set.datab-5;
if(2==set.stopb)bak|=0x04;
if(0!=set.parity)
{
set.parity=set.parity-1;
bak|=0x08;
}
bak|=set.parity<<4;
U1LCR=bak;
U1FCR=0x01;
U1IER=0x01;
return(1);
}
void en_lcd()
{
IO0CLR=LCDCS;
// DelayUS(10);
}
void off_lcd(void)
{
IO0SET=LCDCS;
//DelayUS(10);
}
//写入一个字节
void write_byte(unsigned char dta)
{
uint32 tmp;
tmp=dta<<16;
IO1SET=RD;
IO1CLR=P1PORT;
IO1SET=tmp;
IO0CLR=WR;
IO0SET=WR;
}
//SED1335命令写函数
void sed1335_write(unsigned char commandcode, unsigned char *parameter,unsigned char n)
{
unsigned char i=0;
en_lcd();
IO1SET=A0;
write_byte(commandcode);
for(i=0;i<n;i++)
{
IO1CLR=A0;
write_byte(parameter[i]);
}
}
//sed1335读函数,可以读取光标,显示数据
void sed1335_read(char commandcode, unsigned char *parameter,unsigned int n)
{
int i=0;
uint32 tmp;
en_lcd();
tmp=commandcode<<16;
IO1SET=A0;
IO1SET=RD;
IO1CLR=P1PORT;
IO1SET=tmp;
IO0CLR=WR;
IO0SET=WR;
IO1DIR=A0|RD;
for(i=0;i<n;i++)
{
IO1CLR=A0;
IO0SET=WR;
IO1CLR=RD;
IO1SET=RD;
tmp=IO1PIN;
parameter[i]=tmp>>16;
}
IO1DIR=P1PORT|A0|RD;
}
//============================================================================
//光标地址写入sed1335寄存器并进行校验
//============================================================================
void cursor_write()
{
//unsigned char csr_ver[2];
sed1335_write(csrw,csradd,2);
/*
sed1335_read(csrr,csr_ver,2);
//对于写入的光标地址校验
while((csr_ver[0]!=csradd[0])||(csr_ver[1]!=csradd[1])){
sed1335_write(csrw,csradd,2);
sed1335_read(csrr,csr_ver,2);
}
*/
return;
}
//
void set_xy(unsigned int x, unsigned int y)
{
unsigned int cursor_addr;
if(disp_mode==0){ //点阵坐标定位
if(x>319) x=319;
if(y>239) y=239;
bit_offset=x%8; //相对字节单位的移位
cursor_addr=y*40+(x/8); //计算光标地址
csradd[0]=(unsigned char)cursor_addr;
csradd[1]=(unsigned char)(cursor_addr>>8);
cursor_write();
}
if(disp_mode==1){
bit_offset=0;
if(X>39) X=39; //根据字体限定设定字符坐标范围。
if(Y>14-H_font) Y=14-H_font;
X=x; Y=y;
cursor_addr=y;
cursor_addr=cursor_addr*40*16+x; //计算光标地址
csradd[0]=(unsigned char)cursor_addr;
csradd[1]=(unsigned char)(cursor_addr>>8);
cursor_write();
}
return;
}
//写点函数
void write_dot(int x, int y)
{
unsigned char dot[2];
disp_mode=0;
set_xy(x,y);
dot[1]=0x80>>bit_offset;
sed1335_read(mread,dot,1);
dot[0]|=dot[1];
set_xy(x,y);
sed1335_write(mwrite,dot,1);
return;
}
//开关光标
void cursor_disp(unsigned char onoff)
{
uint16 addr;
unsigned char hl[2]={0x80,0x25};
uint16 i=0;
addr=csradd[1];
addr=addr<<8;
addr+=csradd[0];
addr+=0x2580;
hl[0]=(unsigned char)addr;
hl[1]=(unsigned char)(addr>>8);
en_lcd();
sed1335_write(csrdir_down,null,1);
sed1335_write(csrw, hl,2);
IO1SET=A0;
write_byte(mwrite);
IO1CLR=A0;
if(onoff==1)
{
for(i=0;i<16;i++)
{
write_byte(0xff);
}
}
if(onoff==0)
{
for(i=0;i<16;i++)
{
write_byte(0x00);
}
}
sed1335_write(csrw,csradd,2);
}
//设置光标 X Y 位置,X以字节8bit为单位,Y以线为单位。
void set_cursor(unsigned int x, unsigned int y)
{
unsigned int addr;
X=x; Y=y;
addr=y*40+x;
if(addr>0x2580) return;
csradd[0]=(unsigned char)addr;
csradd[1]=(unsigned char)(addr>>8);
sed1335_write(csrw,csradd,2);
}
/*写任何大小的一块, high点高度,width*8点为宽度*/
void wr_any(unsigned int XX,unsigned int YY, unsigned char *word,unsigned int high,unsigned int width)
{
int k=0;
unsigned char xy[2];
unsigned int adr=0;
adr=YY*40+XX;
xy[0]=(unsigned char)adr;
xy[1]=(unsigned char)(adr>>8);
for( k=0;k<width;k++)
{
sed1335_write(csrw,xy,2);
sed1335_write(csrdir_down,null,1);
sed1335_write(mwrite,word+high*k,high);
xy[0]++;
if(xy[0]==0) xy[1]++;
}
}
void wr_anyb(unsigned int XX,unsigned int YY, unsigned char *word,unsigned int high,unsigned int width)
{
int k=0;
unsigned char xy[2];
unsigned int adr=0;
for( k=0;k<high;k++)
{
adr=YY*40+XX;
xy[0]=(unsigned char)adr;
xy[1]=(unsigned char)(adr>>8);
sed1335_write(csrw,xy,2);
sed1335_write(csrdir_right,null,1);
sed1335_write(mwrite,word+width*k,width);
YY++;
}
}
void Write_Buff(unsigned int x,unsigned int y,unsigned char const wrd[],unsigned int high,unsigned int width)
{
unsigned int i,j;
for(i=0;i<high;i++)
for(j=0;j<width;j++)
Row[y+i].Xbyte[x+j]=wrd[i*width+j];
}
void Write_Char(unsigned int x,unsigned int y,unsigned char str)
{
unsigned int i;
for(i=0;i<12;i++)
Row[y+i].Xbyte[x]=chardot[(str-0x20)*12+i];
}
void Write_String(unsigned int x,unsigned int y,char *str)
{
while(1)
{
if(*str=='\0')break;
Write_Char(x++,y,*str++);
}
}
void Write_BackG(void)
{
Write_Buff(1,0,at1,48,40);
Write_Buff(31,48,at2,192,9);
draw_table();
}
void Write_Message(void)
{
Write_String(11,18,"123456");
Write_String(24,18,"40");
Write_String(31,12,"12345");
Write_String(29,23,"1234567");
Write_String(32,72,"123456");
Write_String(32,106,"123456");
Write_String(32,139,"123456");
Write_String(36,177,"OFF");
Write_String(36,208,"OFF");
}
//清显示内存32K
void clr_scr()
{
unsigned int i=0;
en_lcd();
sed1335_write(csrdir_right,null,1);
sed1335_write(csrw,cur_set_ini1,2);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -