c语言写程序

c语言写程序,第1张

#include<stdioh>

int a[1000];

int main()

{ int n,i,j;

  scanf("%d",&n);

  for(i=1;i<=n;i++)

    for(j=i;j<=n;j+=i)

      a[j]=1-a[j];    

  printf("开着的门:\n");

  for(i=1;i<=n;i++)

    if(a[i])printf("%d ",i);

  printf("\n关着的门:\n");

  for(i=1;i<=n;i++)

    if(!a[i])printf("%d ",i);

  return 0;

}

#include <windowsh>

#include <iostream>

#include<timeh>

const unsigned short SIZE_OF_BUFFER = 1; //缓冲区长度

int g_buffer[SIZE_OF_BUFFER];

bool g_continue = true; //控制程序结束

HANDLE g_hMutex; //用于线程间的互斥

DWORD WINAPI FatherProc(LPVOID); //父进程线程

DWORD WINAPI SonProc(LPVOID); //使用打印机的线程

int main()

{

//创建各个互斥信号

g_hMutex = CreateMutex(NULL,FALSE,NULL);

const unsigned short FATHERS_COUNTS = 1; //父进程线程的个数

const unsigned short SONS_COUNT = 2; //使用打印机的线程的个数

//总的线程数

const unsigned short THREADS_COUNT = FATHERS_COUNTS+SONS_COUNT;

HANDLE hThreads[THREADS_COUNT]; //各线程的handle

DWORD fatherID[FATHERS_COUNTS]; //父进程线程的标识符

DWORD sonID[SONS_COUNT]; //使用打印机的线程的标识符

//父进程线程

for (int i=0;i<FATHERS_COUNTS;++i){

hThreads[i]=CreateThread(NULL,0,FatherProc,NULL,0,&fatherID[i]);

if (hThreads[i]==NULL) return -1;

}

//使用打印机的线程

for (i=0;i<SONS_COUNT;++i){

hThreads[SONS_COUNT+i]=CreateThread(NULL,0,SonProc,NULL,0,&sonID[i]);

if (hThreads[i]==NULL) return -1;

}

while(g_continue){

if(getchar())

{ //按回车后终止程序运行

g_continue = false;

}

}

return 0;

}

//分配打印机

void Append()

{

srand((unsigned)time(0));

std::cerr << "打印机空闲 \n";

if(rand()%2)

{

g_buffer[0]=1;//给PA

}

else

{

g_buffer[0]=0;//给PB

}

}

//son使用打印机

void Take()

{

if(g_buffer[0]==1)

{

std::cerr << "PA使用打印机 ";

std::cerr << "成功" << std::endl<<std::endl; ;

};

if(g_buffer[0]==0)

{

std::cerr << "PB使用打印机 ";

std::cerr << "成功" << std::endl<<std::endl; ;

};

g_buffer[0]=-1;

}

//父进程

DWORD WINAPI FatherProc(LPVOID lpPara)

{

while(g_continue){

WaitForSingleObject(g_hMutex,INFINITE);

Append();

Sleep(1500);

ReleaseMutex(g_hMutex);

}

return 0;

}

//子进程

DWORD WINAPI SonProc(LPVOID lpPara)

{

while(g_continue){

WaitForSingleObject(g_hMutex,INFINITE);

Take();

Sleep(1500);

ReleaseMutex(g_hMutex);

}

return 0;

} 最后的要求自己添加

;完成功能说明:

; 基本功能以及OK,可以在线修改密码Ok,开机默认密码:123456,在线可修改

;功能改进说明:

; 将代码继续优化,将其中的清楚按键设置成具有连按功能的按键,对于SET和SET_OUT利用一个按键来做(利用按键的3S长按进入重新设置密码模式,利用相同按键的短击退出密码设置模式),设置报警模式以及退出报警设置,利用剩余的按键来做。;===============================================

;==============MCU:AT89C52=====================

;============名称:电子密码锁===================

;===========程序编写人:DAIVD===================

;=========程序编写时间:2010年8月3日============

;=功能描述:六位数码管显示,44矩阵键盘作为外设=

;=====通过矩阵键盘可以输入密码以及修改密码======

;=====通过数码管以及LED显示当前密码锁状态=======

;===============版本:V10======================

;=====项目完成时间: ==========

;===============================================

BT0 EQU 20H0 ;节拍法标志位每个节拍为20MS

CHANGE_PW_FLAG EQU 20H1 ;重新设置密码标志位

OK_FLAG EQU 20H2 ;确认密码输入标志位

CLR_FLAG EQU 20H3 ;清楚输入密码标志位

KEY_REG EQU 20H4 ;按键按下标志位

FLASHING_FLAG EQU 20H5 ;闪烁标志位

ONCE_TIME EQU 20H6 ;第一次进入标志位

MEMORY_FLAG EQU 20H7 ;修改密码是两次输入第一次需要记忆

DIGITAL_FLAG EQU 21H0 ;是否需要键入数字标志位

NUM_FLAG EQU 21H1 ;数字键标志位

;FUNCTION_FLAG EQU 21H2 ;功能键标志位

D_DONG_FLAG EQU 21H3 ;消抖标志位

KEY_HAVE_REG EQU 21H4 ;一次按键多次响应标志位

SET_OUT EQU 21H5 ;设置密码状态退出标志位

OTI EQU 21H6 ;第一次进入重置密码模式标志位

COMPARE_EN EQU 21H7

OTII EQU 22H0

ALARM EQU 22H1 ;报警标志位

ALARM_OUT EQU 22H2 ;报警退出标志位

ORIGINAL_PW_1 EQU 30H ;原始密码存储寄存器

ORIGINAL_PW_2 EQU 31H

ORIGINAL_PW_3 EQU 32H

ORIGINAL_PW_4 EQU 33H

ORIGINAL_PW_5 EQU 34H

ORIGINAL_PW_6 EQU 35H

CURRENT_PW_1 EQU 40H ;当前密码存储器

CURRENT_PW_2 EQU 41H

CURRENT_PW_3 EQU 42H

CURRENT_PW_4 EQU 43H

CURRENT_PW_5 EQU 44H

CURRENT_PW_6 EQU 45H

CURRENT_PW_1_REG EQU 46H ;当前密码暂存器

CURRENT_PW_2_REG EQU 47H ;用于密码修改时比较两次输入是否相同

CURRENT_PW_3_REG EQU 48H

CURRENT_PW_4_REG EQU 49H

CURRENT_PW_5_REG EQU 4AH

CURRENT_PW_6_REG EQU 4BH

DISPLAY_REG_0 EQU 36H ;显示寄存器

DISPLAY_REG_1 EQU 37H

DISPLAY_REG_2 EQU 38H

DISPLAY_REG_3 EQU 39H

DISPLAY_REG_4 EQU 3AH

DISPLAY_REG_5 EQU 3BH

COUNT_0 EQU 3CH ;用于闪烁标志位的计数200MS

TH0_BUFFER EQU 3DH ;定时器赋初值寄存器

TL0_BUFFER EQU 3EH

MAZHI_REG EQU 3DH ;44矩阵键盘扫描得到的码值

COUNT_1 EQU 3FH ;用于设置密码标志位的计数超过3S则置一

COUNT_2 EQU 51H ;用于输入密码次数是否超过3次

R2_REG EQU 50H

CHIP_SELECT EQU P1 ;P1作为片选口

OUTPUT EQU P0 ;P0口作为输出口

GREEN_LED EQU P34 ;绿灯代表输入密码正确

YELLOW_LED EQU P33 ;黄灯代表正在输入密码过程中

RED_LED EQU P32 ;红灯代表输入密码错误

SPK EQU P31 ;蜂鸣器代表输入密码超过3次报警

ORG 0000H

LJMP START

ORG 0003H ;中断入口地址写RETI防止出现误判对程序影响

RETI

ORG 000BH

LJMP T0_SER

ORG 0013H

RETI

ORG 001BH

RETI

ORG 0023H

RETI

ORG 002BH

RETI

ORG 0030H

START: MOV ORIGINAL_PW_1,#01 ;设置初始密码

MOV ORIGINAL_PW_2,#02

MOV ORIGINAL_PW_3,#03

MOV ORIGINAL_PW_4,#04

MOV ORIGINAL_PW_5,#05

MOV ORIGINAL_PW_6,#06

MOV TMOD,#01H ;设置定时器0工作方式1采用中断方式

SETB EA

SETB ET0

MOV DPTR,#65536-20000

MOV TH0,DPH

MOV TL0,DPL

MOV TH0_BUFFER,DPH

MOV TL0_BUFFER,DPL

SETB TR0

MOV R0,#CURRENT_PW_1 ;对当前密码以及当前密码暂存器赋初值

REFRESH_PW: MOV @R0,#0B9H ;其中当前密码暂存器用于修改密码时

INC R0 ;比较两次重新输入的密码是否相等用

CJNE R0,#04CH,REFRESH_PW

MOV 20H,#00H

MOV 21H,#00H

MOV 22H,#00H

MOV COUNT_0,#00H

MOV COUNT_1,#00H

MOV COUNT_2,#00H

;=========================================

MAIN: JNB BT0,MAIN

CLR BT0

JNB CHANGE_PW_FLAG,LOOP ;判断是否需要修改密码

;===============修改原始密码模式========== ;当CHANGE_PW_FLAG=1表明进入修改密码模式

JB OTII,LP0

SETB OTII

MOV R2,#0

LP0: JNB SET_OUT,LP

MOV R2,#0

LJMP LP4

LP: JNB OK_FLAG,LOOP1 ;判断是否输入密码完成

CLR OK_FLAG

JNB OTI,LP1 ;判断是不是第一次进入要在输入密码正确的前提下

JNB COMPARE_EN,SAVE_MODE ;记录两次输入的密码是否一致才确定是否需要重置

CALL COMPARE_CODE

LJMP LOOP1

SAVE_MODE: CALL SAVE_CODE

LJMP LOOP1

LP1: CALL ENTER_PW_MODE

CJNE R2,#0,LP2

LJMP LOOP1

LP2: CJNE R2,#7,LP3 ;等于7代表原始密码输入正确,下一步记忆新密码

SETB OTI

MOV R2,#0

LJMP LOOP1

LP3: MOV R2,#8

LP4: CLR ALARM_OUT

CLR SET_OUT

CLR OTI ;清零所有内容恢复等待密码输入状态

CLR OTII

CLR COMPARE_EN

CLR CHANGE_PW_FLAG

LJMP LOOP1

;===============常规输入密码模式==========

LOOP: CLR SET_OUT ;非设置密码格式下也会扫描到SET_OUT

;防止程序进入设置密码状态下直接退出

JNB ALARM,L1

JB ALARM_OUT,L2

CLR SPK

LJMP LOOP3

L2: SETB SPK

CLR ALARM_OUT

CLR ALARM

LJMP LOOP1

L1: JNB OK_FLAG,LOOP1 ;判断是否输入密码完成

CLR OK_FLAG

CALL ENTER_PW_MODE

;==========================================

LOOP1: JNB CLR_FLAG,LOOP2 ;判断是否需要清除所输入密码

CLR CLR_FLAG

LCALL CLR_INPUT_PW

LOOP2: JNB DIGITAL_FLAG,LOOP3 ;判断是否需要输入密码

CLR DIGITAL_FLAG

LCALL INPUT_PW

LJMP LOOP3

;=========================================

LOOP3: LCALL DISPLAY

LCALL KEY_SCAN

INC COUNT_0

MOV A,COUNT_0

CJNE A,#5,LOOP4

MOV COUNT_0,#0

CPL FLASHING_FLAG

LOOP4:

LJMP MAIN

;=============下面是具体的子程序===========

;================检测密码是否正确==========

ENTER_PW_MODE:

CLR OK_FLAG ;比较是否为零,为零的时候

CJNE R2,#0,ENTER_PW_MODE_0 ;代表还没密码输入,直接跳出

LJMP ENTER_PW_MODE_OUT

ENTER_PW_MODE_0:

CJNE R2,#7,$+3 ;用来比较R2是否为7或者8

JC ENTER_PW_MODE_2

MOV R2,#00 ;如果8在BAD的模式下切换到输入密码状态

LJMP ENTER_PW_MODE_OUT ;如果7在GOOD的模式下切换到输入密码状态

ENTER_PW_MODE_2:

CJNE R2,#6,ENTER_PW_MODE_3 ;如果R2里的数字不为6代表密码位数不够,肯定错

MOV R0,#ORIGINAL_PW_1 ;如果R2里的数字等于6那么在比较是否相同

MOV R1,#CURRENT_PW_1

ENTER_PW_MODE_4:

MOV A,@R0

XRL A,@R1 ;相异或内容相同为0

CJNE A,#00H,ENTER_PW_MODE_3

INC R0

INC R1

CJNE R0,#36H,ENTER_PW_MODE_4

MOV R2,#7 ;如果相同代表密码输入正确GOOD

MOV COUNT_2,#0

LJMP ENTER_PW_MODE_OUT

ENTER_PW_MODE_3:MOV R2,#8 ;如果不相同则代表密码不正确BAD

INC COUNT_2

MOV A,COUNT_2

CJNE A,#3,$+3

JC KK

FUZHI: MOV COUNT_2,#00H

SETB ALARM

KK: MOV R0,#CURRENT_PW_1 ;对当前密码以及当前密码暂存器赋初值

REF_PW: MOV @R0,#0B9H ;其中当前密码暂存器用于修改密码时

INC R0 ;比较两次重新输入的密码是否相等用

CJNE R0,#04CH,REF_PW

ENTER_PW_MODE_OUT:

RET

;==========================================

;=============清除所输入的密码=============

CLR_INPUT_PW:

CLR CLR_FLAG

CJNE R2,#0,CLR_INPUT_PW_0 ;如果为零则不 *** 作

LJMP CLR_INPUT_PW_OUT

CLR_INPUT_PW_0:

CJNE R2,#7,$+3 ;用来比较R2是否为7或者8

JC CLR_INPUT_PW_1

MOV R2,#00 ;如果8在BAD的模式下切换到输入密码状态

LJMP CLR_INPUT_PW_OUT ;如果7在GOOD的模式下切换到输入密码状态

CLR_INPUT_PW_1:

DEC R2 ;正常模式下将R2减一

CLR_INPUT_PW_OUT:

RET

;==========================================

;============输入单位密码子程序============

INPUT_PW: JB NUM_FLAG,INPUT_PW_0

LJMP INPUT_PW_OUT

INPUT_PW_0: CLR NUM_FLAG

CJNE R2,#7,$+3 ;比较R2是否大于7,大于C=0

JC INPUT_PW_2

MOV R2,#01 ;数字键按下输入密码

LJMP INPUT_PW_3_3

INPUT_PW_2: CJNE R2,#6,INPUT_PW_3 ;如果当前R2等于则6位密码已经输满则不 *** 作

LJMP INPUT_PW_OUT

INPUT_PW_3: INC R2

INPUT_PW_3_3: MOV R1,#01

MOV R2_REG,R2 ;根据R2的给相应的位送密码

MOV R0,#CURRENT_PW_1

JMP I_LOOP

I_LOOP1: INC R0

INC R1

I_LOOP: MOV A,R1

CJNE A,R2_REG,I_LOOP1

MOV A,R3

MOV @R0,A

INPUT_PW_OUT: RET

;==========================================

;===============SAVE_CODE==================

SAVE_CODE: CJNE R2,#6,SAVE_CLR ;如果R2不等于6代表密码输入错误直接退出

SAVE_IN: MOV R0,#CURRENT_PW_1_REG ;将输入的新密码先保存在密码暂存区

MOV R1,#CURRENT_PW_1 ;46H

SAVE_IN_LOOP: MOV A,@R1

MOV @R0,A

INC R0

INC R1

MOV A,R1

CJNE A,#46H,SAVE_IN_LOOP

SETB COMPARE_EN

MOV R2,#0 ;密码输入正确则程序处于等待输入状态

LJMP SAVE_OUT

SAVE_CLR: MOV R2,#8

CLR SET_OUT

CLR OTI ;清零所有内容恢复等待密码输入状态

CLR OTII

CLR COMPARE_EN

CLR CHANGE_PW_FLAG

SAVE_OUT: RET

;===========================================

;=================COMPARE_CODE==============

COMPARE_CODE: CJNE R2,#6,COMPARE_FAIL ;如果R2不等于6代表上次输入密码数不足6位

COMPARE_IN: MOV R0,#CURRENT_PW_1_REG

MOV R1,#CURRENT_PW_1 ;46H

COMPARE_IN_LOOP:

MOV A,@R1

XRL A,@R0

CJNE A,#00H,COMPARE_FAIL

INC R0

INC R1

MOV A,R1

CJNE A,#46H,COMPARE_IN_LOOP

MOV R0,#ORIGINAL_PW_1

MOV R1,#CURRENT_PW_1 ;46H

TIHUAN_LOOP: MOV A,@R1

MOV @R0,A

INC R0

INC R1

MOV A,R1

CJNE A,#46H,TIHUAN_LOOP

MOV R2,#7

CLR SET_OUT

CLR OTI ;清零所有内容恢复等待密码输入状态

CLR OTII

CLR COMPARE_EN

CLR CHANGE_PW_FLAG

LJMP COMPARE_OUT

COMPARE_FAIL: MOV R2,#8

CLR SET_OUT

CLR OTI ;清零所有内容恢复等待密码输入状态

CLR OTII

CLR COMPARE_EN

CLR CHANGE_PW_FLAG

COMPARE_OUT: RET

;===========================================

;==================显示子程序==============

DISPLAY: MOV R4,#0

MOV DPTR,#TAB_0

MOV A,R2

RL A

JMP @A+DPTR

TAB_0: AJMP DISPLAY_0

AJMP DISPLAY_1

AJMP DISPLAY_2

AJMP DISPLAY_3

AJMP DISPLAY_4

AJMP DISPLAY_5

AJMP DISPLAY_6

AJMP DISPLAY_7

AJMP DISPLAY_8

DISPLAY_0: MOV DPTR,#TAB_1

LJMP REFRESH_DISPLAY

DISPLAY_1: MOV DPTR,#TAB_2

LJMP REFRESH_DISPLAY

DISPLAY_2: MOV DPTR,#TAB_3

LJMP REFRESH_DISPLAY

DISPLAY_3: MOV DPTR,#TAB_4

LJMP REFRESH_DISPLAY

DISPLAY_4: MOV DPTR,#TAB_5

LJMP REFRESH_DISPLAY

DISPLAY_5: MOV DPTR,#TAB_6

LJMP REFRESH_DISPLAY

DISPLAY_6: MOV DPTR,#TAB_7

LJMP REFRESH_DISPLAY

DISPLAY_7: MOV DPTR,#TAB_8

LJMP REFRESH_DISPLAY

DISPLAY_8: MOV DPTR,#TAB_9

REFRESH_DISPLAY:

MOV R0,#DISPLAY_REG_0

DISPLAY_LOOP:

MOV A,R4

MOVC A,@A+DPTR

MOV @R0,A

INC R4

INC R0

MOV A,R0

CJNE A,#3CH,DISPLAY_LOOP ;此时表明数码管显示的数值已送完

DISPLAY_SHOW:

MOV R0,#DISPLAY_REG_0 ;数码管动态显示

MOV R5,#0FEH

NEXT_0: MOV CHIP_SELECT,R5

MOV A,@R0

MOV OUTPUT,A

LCALL DELAY

MOV OUTPUT,#0FFH

INC R0

MOV A,R5

RL A

MOV R5,A ;片选

CJNE R0,#3CH,NEXT_0

CJNE R2,#0,NEXT_6

MOV P3,#0FFH

LJMP DISPLAY_OUT

NEXT_6: CJNE R2,#7,NEXT_1

CLR GREEN_LED

SETB YELLOW_LED

SETB RED_LED

LJMP DISPLAY_OUT

NEXT_1: CJNE R2,#8,NEXT_2

SETB YELLOW_LED

SETB GREEN_LED

CLR RED_LED

LJMP DISPLAY_OUT

NEXT_2: JNB CHANGE_PW_FLAG,NEXT_3

JNB FLASHING_FLAG,NEXT_4

MOV P3,#0FFH

LJMP DISPLAY_OUT

NEXT_4: MOV P3,#00H

LJMP DISPLAY_OUT

NEXT_3: JNB FLASHING_FLAG,NEXT_5

MOV P3,#0F7H

LJMP DISPLAY_OUT

NEXT_5: MOV P3,#0FFH

DISPLAY_OUT: RET

;=======================================

;============按键扫描程序===============

KEY_SCAN: MOV R3,#00H ;对码表扫描进行初始化可以访问到第一位

JNB D_DONG_FLAG,PANDUAN ;判断是否进行过消抖

LCALL FANZHUAN_SCAN ;反转扫描确定码值

CJNE A,#0FFH,L4 ;如果码值等于0FFH可能是抖动或者按键抬起

L3: CLR D_DONG_FLAG ;表明是按键抬起,此时要对D_DONG_FLAG/

CLR KEY_HAVE_REG ;KEY_HAVE_REG进行清零;;;;;;;;;;

CLR COUNT_1

LJMP KEY_SCAN_OUT

L4: JNB ALARM,KEY_SCAN_1

CJNE A,#0B7H,L3

SETB ALARM_OUT

CLR D_DONG_FLAG

LJMP KEY_SCAN_OUT

PANDUAN: LCALL FANZHUAN_SCAN ;第一次进入没有经过消抖判断是否有按键按下

CJNE A,#0FFH,KEY_SCAN_0 ;对所扫描的码值进行比较如果为0FFH没按键按下

LJMP KEY_SCAN_OUT

KEY_SCAN_0: SETB D_DONG_FLAG ;所扫到的码值不等于0FFH可能是按键按下

LJMP KEY_SCAN_OUT

KEY_SCAN_1:

JNB KEY_HAVE_REG,KEY_SCAN_1_1;一次按键多次响应标志位

CJNE A,#0E7H,KEY_SCAN_1_1_1

INC COUNT_1 ;长按处理

MOV A,COUNT_1

CJNE A,#150,KEY_SCAN_1_1_1

MOV COUNT_1,#00H

SETB CHANGE_PW_FLAG

CLR D_DONG_FLAG

CLR KEY_HAVE_REG

KEY_SCAN_1_1_1:

LJMP KEY_SCAN_OUT

KEY_SCAN_1_1: MOV MAZHI_REG,A

KEY_SCAN_LOOP:

MOV DPTR,#TAB_10

MOV A,R3

MOVC A,@A+DPTR

CJNE A,#0FFH,KEY_SCAN_2 ;如果查出的码表值为0FFH代表已经查完了

MOV R3,#0 ;但是没有符合的就代表是乱码不处理

CLR D_DONG_FLAG

CLR KEY_HAVE_REG

LJMP KEY_SCAN_OUT

KEY_SCAN_2: CJNE A,MAZHI_REG,KEY_SCAN_3 ;比较是哪个键按下

CJNE R3,#10,$+3 ;通过比较后形成小于等于9或者大于9两种情况

JNC COMPARE

SHUZI_MODE: SETB KEY_HAVE_REG

SETB NUM_FLAG

SETB DIGITAL_FLAG

LJMP KEY_SCAN_OUT

COMPARE: SETB KEY_HAVE_REG

CJNE R3,#10,COMPARE_0 ;此时R3内的数值大于9则CY=1

SETB OK_FLAG ;等于10为OK键按下

LJMP KEY_SCAN_OUT

COMPARE_0: CJNE R3,#11,COMPARE_1 ;等于11为清除按键按下

SETB CLR_FLAG

LJMP KEY_SCAN_OUT ;等于12为设置密码按键在长按里面加处理

COMPARE_1: CJNE R3,#13,COMPARE_2 ;等于13为设置密码跳出标志

SETB SET_OUT

LJMP KEY_SCAN_OUT

;COMPARE_2: CJNE R3,#14,COMPARE_3

; SETB ALARM

; LJMP KEY_SCAN_OUT

COMPARE_2: CJNE R3,#14,COMPARE_4

SETB ALARM_OUT

LJMP KEY_SCAN_OUT

COMPARE_4: LJMP KEY_SCAN_OUT ;按键加功能

KEY_SCAN_3: INC R3

LJMP KEY_SCAN_LOOP

KEY_SCAN_OUT:

RET

;=======================================

FANZHUAN_SCAN: MOV P2,#0F0H ;反转扫描确定码值

MOV A,P2

ANL A,#0F0H

MOV B,A

MOV P2,#0FH

MOV A,P2

ANL A,#0FH

ORL A,B

RET

;===============显示的码表==============

TAB_1: DB 0BFH,0BFH,0BFH,0BFH,0BFH,0BFH ;------

TAB_2: DB 0B9H,0BFH,0BFH,0BFH,0BFH,0BFH ;+-----

TAB_3: DB 0B9H,0B9H,0BFH,0BFH,0BFH,0BFH ;++----

TAB_4: DB 0B9H,0B9H,0B9H,0BFH,0BFH,0BFH ;+++---

TAB_5: DB 0B9H,0B9H,0B9H,0B9H,0BFH,0BFH ;++++--

TAB_6: DB 0B9H,0B9H,0B9H,0B9H,0B9H,0BFH ;+++++-

TAB_7: DB 0B9H,0B9H,0B9H,0B9H,0B9H,0B9H ;++++++

TAB_8: DB 090H,0A3H,0A3H,0A1H,0FFH,0FFH ;good

TAB_9: DB 083H,0A0H,0A1H,0FFH,0FFH,0FFH ;bad

TAB_10: DB 0EEH,0DEH,0BEH,07EH,0EDH,0DDH,0BDH,07DH ;44矩阵键盘的码表

DB 0EBH,0DBH,0BBH,07BH,0E7H,0D7H,0B7H,77H,0FFH

;=======================================

;==============延时子程序===============

;输入:无

;输出:无

;功能:延时一段时间稳定数码管的显示24MS

DELAY:

MOV R7,#30

DL: MOV R6,#40

DJNZ R6,$

DJNZ R7,DL

RET

;=======================================

;============定时器中断服务程序=========

T0_SER:

MOV TMOD,#01H

SETB BT0

MOV TH0,TH0_BUFFER

MOV TL0,TL0_BUFFER

RETI

;=======================================

END

#include <windowsh>

#include <iostream>

#include<timeh>

const unsigned short SIZE_OF_BUFFER = 1; //缓冲区长度

int g_buffer[SIZE_OF_BUFFER];

bool g_continue = true; //控制程序结束

HANDLE g_hMutex; //用于线程间的互斥

DWORD WINAPI FatherProc(LPVOID); //父进程线程

DWORD WINAPI SonProc(LPVOID); //使用打印机的线程

int main()

{

//创建各个互斥信号

g_hMutex = CreateMutex(NULL,FALSE,NULL);

const unsigned short FATHERS_COUNTS = 1; //父进程线程的个数

const unsigned short SONS_COUNT = 2; //使用打印机的线程的个数

//总的线程数

const unsigned short THREADS_COUNT = FATHERS_COUNTS+SONS_COUNT;

HANDLE hThreads[THREADS_COUNT]; //各线程的handle

DWORD fatherID[FATHERS_COUNTS]; //父进程线程的标识符

DWORD sonID[SONS_COUNT]; //使用打印机的线程的标识符

//父进程线程

for (int i=0;i<FATHERS_COUNTS;++i){

hThreads[i]=CreateThread(NULL,0,FatherProc,NULL,0,&fatherID[i]);

if (hThreads[i]==NULL) return -1;

}

//使用打印机的线程

for (i=0;i<SONS_COUNT;++i){

hThreads[SONS_COUNT+i]=CreateThread(NULL,0,SonProc,NULL,0,&sonID[i]);

if (hThreads[i]==NULL) return -1;

}

while(g_continue){

if(getchar())

{ //按回车后终止程序运行

g_continue = false;

}

}

return 0;

}

//分配打印机

void Append()

{

srand((unsigned)time(0));

std::cerr << "打印机空闲 \n";

if(rand()%2)

{

g_buffer[0]=1;//给PA

}

else

{

g_buffer[0]=0;//给PB

}

}

//son使用打印机

void Take()

{

if(g_buffer[0]==1)

{

std::cerr << "PA使用打印机 ";

std::cerr << "成功" << std::endl<<std::endl; ;

};

if(g_buffer[0]==0)

{

std::cerr << "PB使用打印机 ";

std::cerr << "成功" << std::endl<<std::endl; ;

};

g_buffer[0]=-1;

}

//父进程

DWORD WINAPI FatherProc(LPVOID lpPara)

{

while(g_continue){

WaitForSingleObject(g_hMutex,INFINITE);

Append();

Sleep(1500);

ReleaseMutex(g_hMutex);

}

return 0;

}

//子进程

DWORD WINAPI SonProc(LPVOID lpPara)

{

while(g_continue){

WaitForSingleObject(g_hMutex,INFINITE);

Take();

Sleep(1500);

ReleaseMutex(g_hMutex);

}

return 0;

} 最后的要求自己添加

#include <stdioh>

#include <stdboolh>

#define MIN(a, b) (((a) < (b))  (a) : (b))

int try(bool  locks, int n, int i) {/ n是总的锁数,i是当前需要 *** 作的锁 /

int steps = 0;

if (i != -1) {/ 第一次调用时 i = -1 /

locks[i] = !locks[i];/ 如果锁在环上就拿下,否则就套上 /

steps++;

}

int k;

for (k = 0; k < n; k++) {

if (locks[k])

break;

}

if (k == n) {/ 所有的锁都已经取下 /

return steps;

} else if (k == n - 1) {/ 只有编号为n的锁还在,此时只能 *** 作编号为1的锁 /

printf("only n is there, m(1)\n");

return steps + try(locks, n, 0);

} else {/ 此时可以 *** 作编号为1的锁和编号为k + 1的锁  /

bool  locks_copy = (bool ) malloc(n  sizeof(bool));

int j;

for (j = 0; j < n; j++)

locks_copy[j] = locks[j];

int a = try(locks, n, 0), b = try(locks_copy, n, k + 1);

return steps + MIN(a, b);

}

}

int main() {

int n = 5;

bool  locks = (bool ) malloc(n  sizeof(bool));

printf("nums = %d\n", try(locks, n, -1));

free(locks);

return 0;

}

思路就是这个,唯一要改的是需要存储中间结果否则会出现死循环。C里面有HashMap吗?我是用Java和C++的。有问题就追问吧。

sbitkey;LEDP1^0;voiddelay(){unsignedchari=20;while(i--);}voidmain(){LED=1;//熄灭while(1){if(key==0){delay();LED=~LED;delay();}}

//vc6调试成功!!!

/要求:能够用键盘设置密码,输入密码。如果输入密码与

设置的密码不匹配给出提示,连续三次输入错误就禁止输入。/

#include <stdioh>

#include <stdlibh>

#include <stringh>

#define PR printf

void main()

{

char psw[30]="123456",str[30];

PR("系统原始密码123456\n");

int sum=0;

do {

gets(str);

if(strcmp(str,psw)==0)

{

PR("请设置密码:\n");

gets(psw);

PR("密码设置成功!\n");

break;

}

else

{

sum++;

if(sum==3) {PR("非法用户!\n");exit(0);}

PR("密码错误,请重新输入:\n");}

}

while(sum<3);

}

下面给你一个24C02的程序 你编个主函数把密码存进去 然后再用矩阵扫描 加上判断就可以了

还有个步进电机就哦了 就这块比较难写

#include<reg52h>

#define uchar unsigned char

sbit sda=P0^0;

sbit scl=P0^1;

uchar a;

void delay()

{ ;; }

void start() //开始信号

{

sda=1;

delay();

scl=1;

delay();

sda=0;

delay();

}

void stop() //停止

{

sda=0;

delay();

scl=1;

delay();

sda=1;

delay();

}

void respons() //应答

{

uchar i;

scl=1;

delay();

while((sda==1)&&(i<250))i++;

scl=0;

delay();

}

void init()

{

sda=1;

delay();

scl=1;

delay();

}

void write_byte(uchar date)

{

uchar i,temp;

temp=date;

for(i=0;i<8;i++)

{

temp=temp<<1;

scl=0;

delay();

sda=CY;

delay();

scl=1;

delay();

// scl=0;

// delay();

}

scl=0;

delay();

sda=1;

delay();

}

uchar read_byte()

{

uchar i,k;

scl=0;

delay();

sda=1;

delay();

for(i=0;i<8;i++)

{

scl=1;

delay();

k=(k<<1)|sda;

scl=0;

delay();

}

return k;

}

void delay1(uchar x)

{

uchar a,b;

for(a=x;a>0;a--)

for(b=100;b>0;b--);

}

void write_add(uchar address,uchar date)

{

start();

write_byte(0xa0);

respons();

write_byte(address);

respons();

write_byte(date);

respons();

stop();

}

uchar read_add(uchar address)

{

uchar date;

start();

write_byte(0xa0);

respons();

write_byte(address);

respons();

start();

write_byte(0xa1);

respons();

date=read_byte();

stop();

return date;

}

void main()

{

init();

write_add(8,0x55);

delay1(200);

P1=read_add(8);

while(1);

}

以上就是关于c语言写程序全部的内容,包括:c语言写程序、C语言实现死锁、求AT89C51单片机控制电子密码锁的程序 最好是C语言等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9749574.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存