#include <REG52.H>
#include <INTRINS.H>
sbit speaker=P2^3
sbit RS=P2^4 //P2.4
sbit RW=P2^5 //P2.5
sbit E=P2^6 //P2.6
sbit set=P3^4 //设置键
sbit enter=P3^5//确认键
sbit add1=P3^6//加1键
sbit sub1=P3^7//减1键
bit k=0,f=0,alarmflag1,alarmflag2,xx//k为0表示运行状态,k为1表示设置状态;f为0表示第一行显示,f为1表示第二行显示,alarmflag表示闹钟设置的标号,xx用来给speaker响
char sec,min,hour,week,day,month,year,n,m,hourn,minn,alarm
unsigned char count,key
unsigned char lcdd[]="0123456789"
bit naozhong
/*声明调用函数*/
void dispd()//日期显示函数
void dispt()//时间显示函数
void disalarm()
unsigned char keys()//按键扫描函数
void lcd_w_cmd(unsigned char com)//写命令字函数
void lcd_w_dat(unsigned char dat)//写数据函数
unsigned char lcd_r_start() //读状态函数
void int1()//LCD初始化函数
void delay(unsigned char t) //可控延时函数
void delay1()//软件实现延时函数,5个机器周期
void main()
{
TMOD=0x01//设置为定时器模式1
TH0=0x3c//晶振12MHz,定时时间50ms
TL0=0xb0
IE=0x82 //开全局中断和定时中断
TR0=1 //启动雀掘定时器
sec=0//秒
min=0
minn=0//分
hour=0
hourn=0//时
week=0//星期
day=13//日
month=6//月
year=11//年
count=0 //中断次备岁颂数清0
n=-3 //设置键按下次数,第一行日期
m=-3 //设置键按下次数,第二行时间
xx=1
P0=0xff// 送全1到P0口
int1() // 初始化LCD
delay(255)
while(1)
{
key=keys() /仿郑/读取按键
switch(key)
{
case 0xef: //按下设置键
{
TR0=0
k=1
if(f==0)
{
n=n+3
if(n==9)
{
n=0
m=0
f=1
}
}
else
{
m=m+3
if(alarm==0)
{
if(m==12)
{
m=0
n=0
f=0
}
}
else
{
if(m==6)
m=0
}
}
if(f==0)
{
lcd_w_cmd(0x0d)
lcd_w_cmd(0x86+n)
}
else
{
lcd_w_cmd(0x0d)
if(alarm==0)
lcd_w_cmd(0xc4+m)
else lcd_w_cmd(0xc7+m)
}
} break
case 0xdf: //按下确认键
{
k=0
TR0=1
n=-3
m=-3
f=0
if(alarm==1)
{
alarm=0
alarmflag1=1
lcd_w_cmd(0x01)
}
if(alarmflag2==1)
{
alarmflag1=0
alarmflag2=0
lcd_w_cmd(0x01)
}
} break
case 0xbf: //按下加1键
{
if(k==1)
{
if(f==0)
{
if(n==0){year++if(year==100) year=0}
else if(n==3) {month++if(month==13) month=1}
else {day++if(day==32) day=1}
dispd() //调用第一行显示函数
lcd_w_cmd(0x0d)//光标闪烁
lcd_w_cmd(0x86+n)//返回设置值显示地址
}
else
{
if(alarm==0)
{
if(m==0){hour++if(hour==24) hour=0}
else if(m==3) {min++if(min==60) min=0}
else if(m==6){sec++if(sec==60) sec=0}
else {week++if(week==7) week=0}
dispt() //调用第二行显示函数
lcd_w_cmd(0x0d)//光标闪烁
lcd_w_cmd(0xc4+m)//返回设置值显示地址
}
else
{
if(m==0){hourn++if(hourn==24) hourn=0}
else if(m==3) {minn++if(minn==60) minn=0}
disalarm() //调用第二行显示函数
lcd_w_cmd(0x0d)//光标闪烁
lcd_w_cmd(0xc7+m)//返回设置值显示地址
}
}
}
} break
case 0x7f: //按下减1键
{
if(k==1)
{
if(f==0)
{
if(n==0){year--if(year<0) year=99}
else if(n==3) {month--if(month==0) month=12}
else {day--if(day==0) day=31}
dispd() //调用第一行显示函数
lcd_w_cmd(0x0d)//光标闪烁
lcd_w_cmd(0x86+n)//返回设置值显示地址
}
else
{
if(alarm==0)
{
if(m==0){hour--if(hour<0) hour=23}
else if(m==3) {min--if(min<0) min=59}
else if(m==6){sec--if(sec<0) sec=59}
else {week--if(week<0) week=6}
dispt() //调用第二行显示函数
lcd_w_cmd(0x0d)//光标闪烁
lcd_w_cmd(0xc4+m)//返回设置值显示地址
}
else
{
if(m==0){hourn--if(hourn<0) hourn=23}
else if(m==3) {minn--if(minn<0) minn=59}
disalarm() //调用第二行显示函数
lcd_w_cmd(0x0d)//光标闪烁
lcd_w_cmd(0xc7+m)//返回设置值显示地址
}
}
}
} break
case 0xf7:
{
k=1
alarm=1
f=1
lcd_w_cmd(0x01)
disalarm()
m=3
}break
}
if(k==0)
{
if(alarmflag1==1)
{
if((hour==hourn)&&(min==minn))
{
speaker=xx
xx=~xx
if( alarmflag2==0)
lcd_w_cmd(0x01)
disalarm()
alarmflag2=1
}
else
{
dispd()
dispt()
}
}
else
{
dispd()
dispt()
}
} //调用LCD显示函数
}
}
/*延时函数*/
void delay(unsigned char t)
{
unsigned char j,i
for(i=0i<ti++)
for(j=0j<20j++)
}
/*延时函数1*/
void delay1()
{
_nop_()
_nop_()
_nop_()
}
/*LCD初始化函数*/
void int1()
{
lcd_w_cmd(0x3c)// 设置工作方式
lcd_w_cmd(0x0c)// 设置光标
lcd_w_cmd(0x01)// 清屏
lcd_w_cmd(0x06)// 设置输入方式
lcd_w_cmd(0x80)// 设置初始显示位置
}
/*LCD读状态函数*/
//返回值:返回状态字,最高位D7=0,LCD控制器空闲;D7=1,LCD控制器忙
unsigned char lcd_r_start()
{
unsigned char s
RW=1 //RW=1,RS=0,读LCD状态
delay1()
RS=0
delay1()
E=1 //E端时序
delay1()
s=P0 //从LCD的数据口读状态
delay1()
E=0
delay1()
RW=0
delay1()
return(s) //返回读取的LCD状态字
}
/*LCD写命令函数*/
void lcd_w_cmd(unsigned char com)
{
unsigned char i
do { // 查LCD忙 *** 作
i=lcd_r_start()// 调用读状态字函数
i=i&0x80 // 与 *** 作屏蔽掉低7位
delay(2)
} while(i!=0)// LCD忙,继续查询,否则退出循环
RW=0
delay1()
RS=0 // RW=0,RS=0,写LCD命令字
delay1()
E=1 //E端时序
delay1()
P0=com //将com中的命令字写入LCD数据口
delay1()
E=0
delay1()
RW=1
delay(255)
}
/*LCD写数据函数*/
void lcd_w_dat(unsigned char dat)
{
unsigned char i
do { // 查忙 *** 作
i=lcd_r_start()// 调用读状态字函数
i=i&0x80// 与 *** 作屏蔽掉低7位
delay(2)
} while(i!=0)// LCD忙,继续查询,否则退出循环
RW=0
delay1()
RS=1 // RW=1,RS=0,写LCD数据
delay1()
E=1 // E端时序
delay1()
P0=dat // 将dat中的显示数据写入LCD数据口
delay1()
E=0
delay1()
RW=1
delay(255)
}
/*****定时中断函数*****/
void timer0() interrupt 1
{
TH0=0x3c
TL0=0xb0
count++
if(count==20)
{
count=0
sec++
if(sec==60)
{
sec=0
min++
if(min==60)
{
min=0
hour++
if(hour==24)
{
hour=0
week++
day++
if(week==7) week=0
if(day==29&&month==2&&year%4!=0) {day=1month++}
else if(day==30&&month==2&&year%4==0) {day=1month++}
else if(day==31&&(month==4||month==6||month==9||month==11)) {day=1month++}
else if(day==32&&(month==1||month==3||month==5||month==7||month==8||month==10||month==12)) {day=1month++}
if(month==13)
{
month=1
year++
if(year==100) year=0
}
}
}
}
}
}
/*按键扫描函数*/
unsigned char keys()
{
unsigned char cod,del
P3=0xff
cod=P3&0xff//读入P3口键值
if(cod!=0xff)//先检测有无按键按下
{
delay(100) //去抖
if(cod!=0xff)
{
cod=P3&0xff//读入键值
do//等待键释放
{
P3=0xff
del=P3&0xff
}while(del!=0xff)
return(cod)//返回键值
}
}
return(0xf0) //返回该值
}
/*第一行显示日期函数*/
void dispd()
{
lcd_w_cmd(0x0c)//设置光标不显示、不闪烁
delay(20)
lcd_w_cmd(0x83)//第一行起始显示地址0x80+0x03
delay(20)
lcd_w_dat('2')
delay(2)
lcd_w_dat('0')
delay(2)
lcd_w_dat(lcdd[year/10])
delay(2)
lcd_w_dat(lcdd[year%10])
delay(2)
lcd_w_dat('-')
delay(2)
lcd_w_dat(lcdd[month/10])
delay(2)
lcd_w_dat(lcdd[month%10])
delay(2)
lcd_w_dat('-')
delay(2)
lcd_w_dat(lcdd[day/10])
delay(2)
lcd_w_dat(lcdd[day%10])
delay(2)
}
/*第二行显示时间、星期函数*/
void dispt()
{
lcd_w_cmd(0x0c)//设置光标不显示、不闪烁
delay(20)
lcd_w_cmd(0xc3)//第二行起始显示地址0x80+0x43
delay(20)
lcd_w_dat(lcdd[hour/10])
delay(2)
lcd_w_dat(lcdd[hour%10])
delay(2)
lcd_w_dat(':')
delay(2)
lcd_w_dat(lcdd[min/10])
delay(2)
lcd_w_dat(lcdd[min%10])
delay(2)
lcd_w_dat(':')
delay(2)
lcd_w_dat(lcdd[sec/10])
delay(2)
lcd_w_dat(lcdd[sec%10])
delay(2)
lcd_w_dat(' ')
delay(2)
lcd_w_dat('W')
delay(2)
lcd_w_dat(lcdd[week])
delay(2)
}
void disalarm()
{
lcd_w_cmd(0x0c)//设置光标不显示、不闪烁
delay(20)
lcd_w_cmd(0x80)//第一行起始显示地址0x80+0x03
delay(20)
lcd_w_dat('W')
delay(2)
lcd_w_dat('U')
delay(2)
lcd_w_dat('M')
delay(2)
lcd_w_dat('I')
delay(2)
lcd_w_dat('N')
delay(2)
lcd_w_dat('G')
delay(2)
lcd_w_dat('L')
delay(2)
lcd_w_dat('I')
delay(2)
lcd_w_dat('N')
delay(2)
lcd_w_dat(' ')
delay(2)
lcd_w_dat(' ')
delay(2)
lcd_w_dat('M')
delay(2)
lcd_w_dat('A')
delay(2)
lcd_w_dat('K')
delay(2)
lcd_w_dat('E')
delay(2)
lcd_w_cmd(0x0c)//设置光标不显示、不闪烁
delay(20)
lcd_w_cmd(0xc6)//第二行起始显示地址0x80+0x43
delay(20)
lcd_w_dat(lcdd[hourn/10])
delay(2)
lcd_w_dat(lcdd[hourn%10])
delay(2)
lcd_w_dat(':')
delay(2)
lcd_w_dat(lcdd[minn/10])
delay(2)
lcd_w_dat(lcdd[minn%10])
delay(2)
}
#include "stdafx.h"#include "iostream.h"
#define M 2000
#define N 8
void magic(int a[M][M], int)
int main(int argc, char* argv[])
{
static int a[M][M]
int d = 12
int n = 8
while(1){
while(1)
{
cout<<"请输入方阵芹森的阶数, 阶数必须能被4整除:"
cin>>n
if(n%4 != 0 )cout<<仿察"笨蛋,看清楚题目!\n"<<endl
else if(n>64)cout<<n<<"! 这么大, 想累死我啊, 不给算了!\n"<<endl
else break
}
//Init
for(int i=1i<=ni++)
{
for(int j=1j<=nj++)
{
a[i][j]=d
d++
// d++
}
}
magic(a, n)
//Print dimension and sum for rows
for( i=1i<=ni++)
{
int sum=0
for(int j=1j<=nj++)
{
cout<<a[i][j]<<"\t"
sum+=a[i][j]
}
cout<<" | "<<sum<<"\n\n"
}
//Print sum of columns
for(i = 1i<=ni++)cout<<"--\t"
cout<<"\n"
for(i=1i<=ni++)
{
int sum = 0
for(int j = 1j<=nj++) sum += a[j][i]
cout<<sum<<"\t"
}
cout<<"\n\n"
char c
cout<<"Continue?(y/n)"
cin>>c
if(c=='n'|| c=='N')break
}
return 0
}
void exchg(int &a, int &b)
{
int t
t = a
a = b
b = t
}
void magic(int a[M][M], int n) // a:= 矩阵 n:= 实际阶数
{
int baseBlock_x=0
int baseBlock_y=0
int MaxBlock = n/4
if(MaxBlock%2==0)
{
for(int bx = 0bx<MaxBlock/2bx++)
for(int by=0by<MaxBlockby++)
{
for(int c = 1c <= 4c++)
{
exchg(a[bx*4+c][by*4+c], a[n+1-bx*4-c][n+1-by*4-c])
exchg(a[bx*4+c][by*4+5-c], a[n+1-bx*4-c][n+1-by*4-5+c])
}
}
}
else
{
for(int bx = 0bx<MaxBlock/2bx++)
{
for(int by=0by<MaxBlockby++)
{
for(int c = 1c <备首茄= 4c++)
{
exchg(a[bx*4+c][by*4+c], a[n+1-bx*4-c][n+1-by*4-c])
exchg(a[bx*4+c][by*4+5-c], a[n+1-bx*4-c][n+1-by*4-5+c])
}
}
}
bx = MaxBlock/2
for(int by=0by<MaxBlockby++)
{
for(int c = 1c <= 2c++)
{
exchg(a[bx*4+c][by*4+c], a[n+1-bx*4-c][n+1-by*4-c])
exchg(a[bx*4+c][by*4+5-c], a[n+1-bx*4-c][n-by*4-4+c])
}
}
}
}
// 电话本Dlg.cpp : 实现文件//
#include stdafx.h
#include 电话本.h
#include 电话本Dlg.h
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
/正帆中/ C电话本Dlg 对话框
C电话本Dlg::C电话本Dlg(CWnd* pParent /*=NULL*/)
: CDialog(C电话本Dlg::IDD, pParent)
{
m_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME)
}
void C电话本Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX)
}
BEGIN_MESSAGE_MAP(C电话本Dlg, CDialog)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_EN_CHANGE(IDC_EDIT1, C电话本Dlg::OnName)
ON_EN_CHANGE(IDC_EDIT2, C电话本Dlg::OnPhoto)
ON_EN_CHANGE(IDC_EDIT3, C电话本Dlg::OnAddress)
ON_EN_CHANGE(IDC_EDIT4, C电话本Dlg::OnShow)
ON_BN_CLICKED(IDC_BUTTON1, C电话本轿李Dlg::OnFill)
ON_BN_CLICKED(IDC_BUTTON2, C电话本Dlg::OnInsert)
ON_BN_CLICKED(IDC_BUTTON3, C电话本Dlg::OnFind)
ON_BN_CLICKED(IDC_BUTTON4, C电话本Dlg::OnDelete)
ON_BN_CLICKED(IDC_BUTTON5, C电话本Dlg::OnEdit)
ON_BN_CLICKED(IDC_BUTTON7, C电话本Dlg::OnSave)
END_MESSAGE_MAP()
// C电话本Dlg 消息处理程序
BOOL C电话本Dlg::OnInitDialog()
{
CDialog::OnInitDialog()
// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此 *** 作
SetIcon(m_hIcon, TRUE) // 设置大图标
SetIcon(m_hIcon, FALSE) // 设置小图标
// TODO: 在此添加额外的初始化代码
ifstream InFile(Wab.fsd,ios::in)
listWabList::iterator ItWab
char Tmp1[8],Tmp2[16],Tmp3[32]
Wab.clear()
while(InFile Tmp1 Tmp2 Tmp3)
{
OutWab.Name=Tmp1
OutWab.Photo=Tmp2
OutWab.Address=Tmp3
Wab.push_front(OutWab)
}
C电话本Dlg::OnFill()
return TRUE // 除非将焦点设置到控举山件,否则返回 TRUE
}
// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。
void C电话本Dlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this)// 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_castWPARAM(dc.GetSafeHdc()), 0)
// 使图标在工作矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON)
int cyIcon = GetSystemMetrics(SM_CYICON)
CRect rect
GetClientRect(rect)
int x = (rect.Width() - cxIcon 1) / 2
int y = (rect.Height() - cyIcon 1) / 2
// 绘制图标
dc.DrawIcon(x, y, m_hIcon)
}
else
{
CDialog::OnPaint()
}
}
//当用户拖动最小化窗口时系统调用此函数取得光标显示。
//
HCURSOR C电话本Dlg::OnQueryDragIcon()
{
return static_castHCURSOR(m_hIcon)
}
void C电话本Dlg::OnName()
{
CEdit *pMaxLen=(CEdit*)GetDlgItem(IDC_EDIT1)
pMaxLen-SetLimitText(6)
GetDlgItemText(IDC_EDIT1,InWab.Name)
}
void C电话本Dlg::OnPhoto()
{
CEdit *pMaxLen=(CEdit*)GetDlgItem(IDC_EDIT2)
pMaxLen-SetLimitText(11)
GetDlgItemText(IDC_EDIT2,InWab.Photo)
}
void C电话本Dlg::OnAddress()
{
CEdit *pMaxLen=(CEdit*)GetDlgItem(IDC_EDIT3)
pMaxLen-SetLimitText(30)
GetDlgItemText(IDC_EDIT3,InWab.Address)
}
void C电话本Dlg::OnShow()
{
// TODO: 如果该控件是 RICHEDIT 控件,则它将不会
// 发送该通知,除非重写 CDialog::OnInitDialog()
// 函数并调用 CRichEditCtrl().SetEventMask(),
// 同时将 ENM_CHANGE 标志“或”运算到掩码中。
// TODO: 在此添加控件通知处理程序代码
}
void C电话本Dlg::OnFill()
{
CString OutAll,OutTemp,Space,Enter
Space=_T( )
Enter=_T(\r\n)
listWabList::iterator ItWab
for(ItWab=Wab.begin()ItWab!=Wab.end()ItWab )
{
OutWab=*ItWab
OutTemp=OutWab.Name Space OutWab.Photo Space OutWab.Address
OutAll=OutAll OutTemp Enter
}
SetDlgItemText(IDC_EDIT4,OutAll)
}
void C电话本Dlg::OnInsert()
{
Wab.push_front(InWab)
C电话本Dlg::OnFill()
}
void C电话本Dlg::OnFind()
{
CString OutAll,OutTemp,Space,Enter
Space=_T( )
Enter=_T(\r\n)
listWabList::iterator ItWab
for(ItWab=Wab.begin()ItWab!=Wab.end()ItWab )
{
if(ItWab-Name==InWab.Name)
{
OutTemp=ItWab-Name Space ItWab-Photo Space ItWab-Address
OutAll=OutAll OutTemp Enter
}
}
SetDlgItemText(IDC_EDIT4,OutAll)
}
void C电话本Dlg::OnDelete()
{
CString OutAll,OutTemp,Space,Enter
Space=_T( )
Enter=_T(\r\n)
listWabList::iterator ItWab
for(ItWab=Wab.begin()ItWab!=Wab.end()ItWab )
{
if(ItWab-Name==InWab.Name)
{
OutTemp=ItWab-Name Space ItWab-Photo Space ItWab-Address
OutAll=OutAll OutTemp Enter
break
}
}
SetDlgItemText(IDC_EDIT4,OutAll)
if(ItWab!=Wab.end()) Wab.erase(ItWab)
}
void C电话本Dlg::OnEdit()
{
CString OutAll,OutTemp,Space,Enter
Space=_T( )
Enter=_T(\r\n)
listWabList::iterator ItWab
for(ItWab=Wab.begin()ItWab!=Wab.end()ItWab )
{
if(ItWab-Name==InWab.Name)
{
OutTemp=ItWab-Name Space ItWab-Photo Space ItWab-Address
OutAll=OutAll OutTemp Enter
break
}
}
SetDlgItemText(IDC_EDIT4,OutAll)
if(ItWab!=Wab.end())
{
Wab.erase(ItWab)
Wab.push_front(InWab)
}
}
void C电话本Dlg::OnSave()
{
CString Tmp1,Tmp2,Tmp3
ofstream OutFile(Wab.fsd,ios::out)
listWabList::iterator ItWab
for(ItWab=Wab.begin()ItWab!=Wab.end()ItWab )
{
Tmp1=ItWab-Name
Tmp2=ItWab-Photo
Tmp3=ItWab-Address
OutFile Tmp1 ' ' Tmp2 ' ' Tmp3 endl
}
}
只是个用C语言编写的电话本程序 很有实用意义
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)