📄 main.c
字号:
/************************************************************************************
* Copyright (c) 2004,西安铭朗电子科技有限责任公司
* All rights reserved.
*
* 文件名称: main.C
* 文件标识: none
* 适用器件: C8051F120
*
* 摘 要: 本文件是LCD测试程序,功能:开机显示"铭朗科技,WWW.MLARM.COM"信息,为待机界面。
* 定义'A'~'F'为功能键。按"A"显示画点图形,按"B"显示画直线图形,按"C"显示画矩型图形,
* 按"D"显示画矩型图形,按"E"显示画圆形图形, "F"显示待机界面.将跳线器JP8短接,R44闲置。
* 使用外部22.1184MHz晶振.
*
* 当前版本:1.2
* 作 者:李林利
* 完成日期:2005年6月19日
*
* 当前版本:1.0
* 作 者:卢 阳
* 完成日期:2004年11月14日
*
* 历史版本:0.9
* 原作者 : 李林利
* 完成日期:2004年7月1日
*************************************************************************************/
/************************************************************************************/
// 引用外部头文件
#include "c8051F120.h"
#include "Const.h"
#include "lcd.h"
#include "key.h"
#include "Delay.h"
/************************************************************************************/
unsigned char key;
/************************************************************************************
// 系统初始化功能子程序
*************************************************************************************/
/***********************************************************************************
* 函数名称:SYSCLK_Init;
*
* 函数功能描述:系统时钟初始化,使用外部22.1184MHz晶振作为时钟源,using the PLL;
* This routine initializes the system clock to use an external 22.1184 MHz
* crystal oscillator multiplied by a factor of 9/2 using the PLL as its
* clock source. The resulting frequency is 22.1184 MHz * 9/2 = 100(99.6) MHz
*
* 输入参数:none;
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/
void SYSCLK_Init (void)
{
int i; // delay counter
char data SFRPAGE_SAVE = SFRPAGE; // Save Current SFR page
SFRPAGE = CONFIG_PAGE; // set SFR page
OSCXCN = 0x67; // start external oscillator with
// 22.1184MHz crystal
for (i=0; i < 256; i++) ; // Wait for osc. to start up
while (!(OSCXCN & 0x80)) ; // Wait for crystal osc. to settle
CLKSEL = 0x01; // Select the external osc. as
// the SYSCLK source
OSCICN = 0x00; // Disable the internal osc.
//Turn on the PLL and increase the system clock by a factor of M/N = 2/2
SFRPAGE = CONFIG_PAGE;
PLL0CN = 0x04; // Set PLL source as external osc.
SFRPAGE = LEGACY_PAGE;
FLSCL = 0x00; // Set FLASH read time for 25MHz clk
// or less
SFRPAGE = CONFIG_PAGE;
PLL0CN |= 0x01; // Enable Power to PLL
PLL0DIV = 0x02; // Set Pre-divide value to N (N = 2)
PLL0FLT = 0x37; // Set the PLL filter register for
// a reference clock from 7.8 - 12.5 MHz
// and an output clock from 25 - 50 MHz
PLL0MUL = 0x02; // Multiply SYSCLK by M (M = 2)
for (i=0; i < 256; i++); // Wait at least 5us
PLL0CN |= 0x02; // Enable the PLL
while(!(PLL0CN & 0x10)); // Wait until PLL frequency is locked
CLKSEL = 0x02; // Select PLL as SYSCLK source
SFRPAGE = SFRPAGE_SAVE; // Restore SFR page
}
/***********************************************************************************
* 函数名称:PORT_Init;
*
* 函数功能描述:配置端口初始化,配置交叉开关和端口;
*
* 输入参数:none;
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/
void PORT_Init (void)
{
char data SFRPAGE_SAVE = SFRPAGE; // Save Current SFR page
SFRPAGE = SFR_PAGE_F; // set SFR page F
XBR0 = 0x8f; //设置XBR0
XBR1 = 0x1e; //设置XBR1
XBR2 = 0x44; //打开交叉开关和弱上拉
P0MDOUT = 0x34; //设置P0口输出
P1MDOUT = 0xfc; //设置P1口输出
P1MDIN = 0xff; //设置P1口输入信号类型
P2MDOUT = 0xf0; //设置P2口输出
P3MDOUT = 0xff; //设置P3口全部推挽输出
P4MDOUT = 0xff; //设置P4口输出
P5MDOUT = 0x0f; //设置P5口输出
P6MDOUT = 0xff; //设置P6口输出
P7MDOUT = 0xff; //设置P7口输出
P4 = 0xe0; //P4口置0,禁铃
SFRPAGE = SFR_PAGE_0; // set SFR page 0
// EMI0CF=0x2d; //外部存储器接口配置
// EMI0TC=0x9e; //外部存储器时序控制
EMI0CF=0x2f; //外部存储器接口配置
EMI0TC=0xff; //外部存储器时序控制
SFRPAGE = SFRPAGE_SAVE; // Restore SFR page
}
/***********************************************************************************
* 函数名称:Cache_Init;
*
* 函数功能描述:配置Cache初始化;
*
* 输入参数:none;
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/
void Cache_Init (void)
{
char SFRPAGE_SAVE = SFRPAGE; // Save Current SFR page
SFRPAGE = SFR_PAGE_F; // set SFR page F
// CCH0CN = 0x60;//0xee; /*SFR Page: F Cache Control */
//CCH0LC = 0xA3; /*SFR Page: F Cache Lock */
//CCH0MA = 0x9A; /*SFR Page: F Cache Miss Accumulator */
//CCH0TN = 0xA2; /*SFR Page: F Cache Tuning */
SFRPAGE = SFRPAGE_SAVE; // Restore SFR page
}
/***********************************************************************************
* 函数名称:Draw_dot;
*
* 函数功能描述:画点序列;
*
* 输入参数:none;
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/
void Draw_dot(void)
{
unsigned char x;
unsigned char y;
dis_clr();
x=0;
y=0;
while(1)
{
Delay_ms(10);
LCD_Draw_dot(x,y,1);
x+=2;
if(x>128)
{
y++;
x=0;
}
if(y>64)
{
dis_clr();
y=0;
}
key=GetKey();
if((key!=0xff)&&(key!=0x0a))
return;
}
}
/***********************************************************************************
* 函数名称:Draw_line;
*
* 函数功能描述:画过圆点的直线;
*
* 输入参数:none;
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/
void Draw_line(void)
{ unsigned char x;
unsigned char y;
dis_clr();
x=0;
y=0;
while(1)
{
Delay_ms(200);
dis_clr();
LCD_Draw_line(0,0,x,y,1);
y+=3;
if(y<63)
{
x=127;
}
if(y>63)
{
y=63;
x-=6;
if(x<=5)
{
y=0;
x=127;
dis_clr();
}
}
key=GetKey();
if((key!=0xff)&&(key!=0x0b))
return;
}
}
/***********************************************************************************
* 函数名称:Draw_Rectangle;
*
* 函数功能描述:画矩形;
*
* 输入参数:none;
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/
void Draw_Rectangle(void)
{
unsigned char x;
unsigned char y;
dis_clr();
x=0;
y=0;
while(1)
{
Delay_ms(200);
LCD_Draw_Rectangle(63-x,31-y,63+x,31+y,1);
x+=4;
y+=2;
if(x>64)
{
x=0;
dis_clr();
}
if(y>32)
{
dis_clr();
y=0;
}
key=GetKey();
if((key!=0xff)&&(key!=0x0c))
return;
}
}
/***********************************************************************************
* 函数名称:Draw_FillRectangle;
*
* 函数功能描述:画实心矩形;
*
* 输入参数:none;
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/
void Draw_FillRectangle(void)
{ unsigned char x;
unsigned char y;
dis_clr();
x=0;
y=0;
while(1)
{
Delay_ms(200);
dis_clr();
LCD_Draw_FillRectangle(63-x,31-y,63+x,31+y,1);
x+=4;
y+=2;
if(x>64)
{
x=0;
dis_clr();
}
if(y>32)
{
dis_clr();
y=0;
}
key=GetKey();
if((key!=0xff)&&(key!=0x0d))
return;
}
}
/***********************************************************************************
* 函数名称:Draw_circle;
*
* 函数功能描述:画同心圆;
*
* 输入参数:none;
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/
void Draw_circle(void)
{
unsigned char x;
dis_clr();
x=0;
while(1)
{
Delay_ms(200);
LCD_Draw_circle(63,31,x,1);
x+=3;
if(x>32)
{
x=0;
dis_clr();
}
key=GetKey();
if((key!=0xff)&&(key!=0x0e))
return;
}
}
/************************************************************************************
// 主循环程序
*************************************************************************************/
void main(void)
{
//禁止看门狗定时器
WDTCN = 0xde;
WDTCN = 0xad;
//初始化
SYSCLK_Init ();
PORT_Init ();
Key_Init();
lcd_init();
dis_full();
Delay_ms(500);
dis_clr();
Delay_ms(500);
dis_start0();
while(1)
{
key=GetKey(); //调用键盘扫描函数,返回的键值送变量key
if(key!=0xFF)
{
Alarm(1); //响铃
Delay_ms(250);
Alarm(0); //关闭铃声
switch (key)
{
case 0x0a:
Draw_dot();
break;
case 0x0b:
Draw_line();
break;
case 0x0c:
Draw_Rectangle();
break;
case 0x0d:
Draw_FillRectangle();
break;
case 0x0e:
Draw_circle();
break;
case 0x0f:
dis_clr();
dis_start0();
break;
default: break;
}
}
Delay_ms(20);
}
}
/***********************************************************************************/
// 文件结束
/***********************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -